es6学习笔记之Async函数的使用示例
前言
异步操作是JavaScript编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。
从最早的回调函数,到Promise对象,再到Generator函数,每次都有所改进,但又让人觉得不彻底。它们都有额外的复杂性,都需要理解抽象的底层运行机制。
异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用关心它是不是异步。
async函数就是隧道尽头的亮光,很多人认为它是异步操作的终极解决方案。下面就来看看关于async函数的两个栗子:
栗子一:从豆瓣API获取数据
varfetchDoubanApi=function(){
returnnewPromise((resolve,reject)=>{
varxhr=newXMLHttpRequest();
xhr.onreadystatechange=function(){
if(xhr.readyState===4){
if(xhr.status>=200&&xhr.status<300){
varresponse;
try{
response=JSON.parse(xhr.responseText);
}catch(e){
reject(e);
}
if(response){
resolve(response,xhr.status,xhr);
}
}else{
reject(xhr);
}
}
};
xhr.open('GET','https://api.douban.com/v2/user/aisk',true);
xhr.setRequestHeader("Content-Type","text/plain");
xhr.send(data);
});
};
(asyncfunction(){
try{
letresult=awaitfetchDoubanApi();
console.log(result);
}catch(e){
console.log(e);
}
})();
栗子二:根据电影文件名,自动下载对应的海报
importfsfrom'fs';
importpathfrom'path';
importrequestfrom'request';
varmovieDir=__dirname+'/movies',
exts=['.mkv','.avi','.mp4','.rm','.rmvb','.wmv'];
//读取文件列表
varreadFiles=function(){
returnnewPromise(function(resolve,reject){
fs.readdir(movieDir,function(err,files){
resolve(files.filter((v)=>exts.includes(path.parse(v).ext)));
});
});
};
//获取海报
vargetPoster=function(movieName){
leturl=`https://api.douban.com/v2/movie/search?q=${encodeURI(movieName)}`;
returnnewPromise(function(resolve,reject){
request({url:url,json:true},function(error,response,body){
if(error)returnreject(error);
resolve(body.subjects[0].images.large);
})
});
};
//保存海报
varsavePoster=function(movieName,url){
request.get(url).pipe(fs.createWriteStream(path.join(movieDir,movieName+'.jpg')));
};
(async()=>{
letfiles=awaitreadFiles();
//await只能使用在原生语法
for(varfileoffiles){
letname=path.parse(file).name;
console.log(`正在获取【${name}】的海报`);
savePoster(name,awaitgetPoster(name));
}
console.log('===获取海报完成===');
})();
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。