JavaScript中的await/async的作用和用法
await/async是ES7最重要特性之一,它是目前为止JS最佳的异步解决方案了。虽然没有在ES2016中录入,但很快就到来,目前已经在ES-NextStage4阶段。
直接上例子,比如我们需要按顺序获取:产品数据=>用户数据=>评论数据
老朋友Ajax
传统的写法,无需解释
//获取产品数据
ajax('products.json',(products)=>{
console.log('AJAX/products>>>',JSON.parse(products));
//获取用户数据
ajax('users.json',(users)=>{
console.log('AJAX/users>>>',JSON.parse(users));
//获取评论数据
ajax('products.json',(comments)=>{
console.log('AJAX/comments>>>',JSON.parse(comments));
});
});
});
不算新的朋友Promise
Promise已经被提及已久了,也是ES6的一部分。Promise能消除callbackhell带来的厄运金字塔,相比起来代码更清晰了。
//Promise
//封装Ajax,返回一个Promise
functionrequestP(url){
returnnewPromise(function(resolve,reject){
ajax(url,(response)=>{
resolve(JSON.parse(response));
});
});
}
//获取产品数据
requestP('products.json').then(function(products){
console.log('Promises/products>>>',products);
});
//获取用户数据
requestP('users.json').then(function(users){
console.log('Promises/users>>>',users);
});
//获取评论数据
requestP('comments.json').then(function(comments){
console.log('Promises/comments>>>',comments);
});
当然使用Promise.all可以更简洁
Promise.all([
requestP('products.json'),
requestP('users.json'),
requestP('comments.json')
])
.then(function(data){
console.log('Parallelpromises>>>',data);
});
强劲的新朋友Generators
Generators也是ES6一个新的特性,能够暂停/执行代码。yield表示暂停,iterator.next表示执行下一步,如果你不了解Generators也没关系,可以忽略它直接学习await/async。
//Generators
functionrequest(url){
ajax(url,(response)=>{
iterator.next(JSON.parse(response));
});
}
function*main(){
//获取产品数据
letdata=yieldrequest('products.json');
//获取用户数据
letusers=yieldrequest('users.json');
//获取评论数据
letproducts=yieldrequest('comments.json');
console.log('Generator/products>>>',products);
console.log('Generator/users>>>',users);
console.log('Generator/comments>>>',comments);
}
variterator=main();
iterator.next();
碉堡的朋友await/async
与Promise结合使用
//封装Ajax,返回一个Promise
functionrequestP(url){
returnnewPromise(function(resolve,reject){
ajax(url,(response)=>{
resolve(JSON.parse(response));
});
});
}
(async()=>{
//获取产品数据
letdata=awaitrequestP('products.json');
//获取用户数据
letusers=awaitrequestP('users.json');
//获取评论数据
letproducts=awaitrequestP('comments.json');
console.log('ES7Async/products>>>',products);
console.log('ES7Async/users>>>',users);
console.log('ES7Async/comments>>>',comments);
}());
与FetchAPI结合使用:
(async()=>{
//Async/awaitusingthefetchAPI
try{
//获取产品数据
letproducts=awaitfetch('products.json');
//Parsingproducts
letparsedProducts=awaitproducts.json();
//获取用户数据
letusers=awaitfetch('users.json');
//Parsingusers
letparsedUsers=awaitusers.json();
//获取评论数据
letcomments=awaitfetch('comments.json');
//Parsingcomments
letparsedComments=awaitcomments.json();
console.log('ES7Async+fetch/products>>>',parsedProducts);
console.log('ES7Async+fetch/users>>>',parsedUsers);
console.log('ES7Async+fetch/comments>>>',parsedComments);
}catch(error){
console.log(error);
}
}());
按数组顺序执行
(async()=>{
letparallelData=await*[
requestP('products.json'),
requestP('users.json'),
requestP('comments.json')
];
console.log('Asyncparallel>>>',parallelData);
}());
再次结合Fetch
(async()=>{
letparallelDataFetch=await*[
(awaitfetch('products.json')).json(),
(awaitfetch('users.json')).json(),
(awaitfetch('comments.json')).json()
];
console.log('Asyncparallel+fetch>>>',parallelDataFetch);
}());
使用await/async用同步的思维去解决异步的代码,感觉非常酷非常爽!关于js中的await/async的作用和用法就给大家介绍这么多,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!