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('===获取海报完成==='); })();
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。