AsyncNode.js是一种异步服务器端语言。在大量异步场景下,需要顺序执行。正常的方式是用回调嵌套回调。嵌套回调太多。这个问题被称为回调地狱。Node.js推出了异步控制流来解决这个问题————AsyncAsync/AwaitAsync/Await是针对ES7的解决方案,结合ES6的Promise对象,使用前请确保Node.js版本在7.6以上。async/await的主要好处是可以避免回调地狱(callbackhell),以最接近同步代码的方式编写异步代码。基本规则async表示这是一个async函数,await只能在这个函数中使用。await意思是等待promise返回这里的结果再继续执行。await后面应该跟一个promise对象,比较使用场景:3秒后返回一个值原来时代letsleep=(time,cb)=>{setTimeout(()=>{cb('ok');},3000);}letstart=()=>{sleep(3000,(result)=>{console.log(result)})}start()Promisetimesletsleep=(time)=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve('ok');},time);})}letstart=()=>{sleep(3000).then((result)=>{console.log(result)})}start()Async/Awaiteraletsleep=(time)=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve('ok');},时间);})}letstart=async()=>{letresult=awaitsleep(3000);控制台日志(结果)}开始();捕获错误letsleep=(time)=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{reject('error');},time);})}letstart=async()=>{尝试{让重新sult=等待睡眠(3000);console.log(result)}catch(err){console.log('error')}}start();在循环中使用letsleep=(time)=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve('ok');},time);})}letstart=async()=>{for(vari=1;i<=3;i++){console.log(`当前是第${i}次等候..`);等待睡眠(1000);}}start();蜘蛛中使用constrequest=require('request');constfs=require('fs');constcheerio=require('cheerio');letspider=(url)=>{returnnewPromise((resolve,reject)=>{request(url,(error,response,body)=>{resolve(body);})})}letstart=async()=>{letdom=awaitspider('http://www.lanrentuku.com/');让$=cheerio.load(dom);$('img','.in-ne').each((i,e)=>{letsrc=$(e).attr('src');letname=src.substr(src.lastIndexOf('/')+1);请求(src).pipe(fs.createWriteStream(名称))})}开始();
