是国外初学者技术博客RisingStack的另一篇Node.js相关技术文章。原文请看这里。几个月前,JavaScript引擎V8添加了async/await特性。Node.js也相应地更新了它的V8版本,最新的Nightly版本终于添加了具有async/await特性的V8引擎。注意:目前async/await功能仅在不稳定版本的Nightly中可用。暂时不建议在生产环境中使用。什么是异步/等待?首先我们来看看如何使用Promise进行异步编程。下面这个小例子展示了如何通过FetchAPI和Promise获取数据:.catch()可以通过async/await实现Promise中的await功能。意思是它可以以非阻塞的方式暂时中止代码的执行,等待之前的结果返回。如果promise的最终状态不是resolved而是rejected,它会抛出一个带有rejected值的异常,可以用try/catch块捕获。如果上面的例子是用async/await实现的,它看起来像这样:asyncfunctiongetTrace(){letpageContenttry{pageContent=awaitfetch('https://trace.risingstack.com',{method:'get'})}catch(ex){console.error(ex)}returnpageContent}getTrace().then()想深入了解async/await,推荐以下两篇文章:https://ponyfoo.com/articles/...https://tc39.github.io/ecmasc...在没有转译器的情况下使用async/await1.安装Node.jsv7首先,获取最新的Nightly构建。如果你使用nvm,你可以使用下面的方法安装:NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightlynvminstall7nvmuse72.尝试用async/await运行一个文件首先创建一个简单的JavaScript文件,使用setTimeout实现一个函数的延迟执行,用async/await调用。//app.jsconsttimeout=function(delay){returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve()},delay)})}asyncfunctiontimer(){console.log('定时器开始')awaitPromise.resolve(timeout(100));console.log('timerfinished')}timer()文件创建完成后,尝试运行:nodeapp.js但是这样不行,因为async/await还是需要通过特殊的方式执行,如图下图:node--harmony-async-awaitapp.js3.使用async/await创建web服务器以Koav2为例,Koa现在以中间件函数的形式支持异步。在此之前,这只能通过转译器实现。你可以简单地传入一个异步函数作为中间件://app.jsconstKoa=require('koa')constapp=newKoa()app.use(async(ctx,next)=>{conststart=newDate()awaitnext()constms=newDate()-启动console.log(`${ctx.method}${ctx.url}-${ms}ms`)})app.use(ctx=>{ctx.body='HelloKoa'})app.listen(3000)像这样,用Koa创建一个服务器,然后运行它:node--harmony-async-awaitapp.js,当它准备好使用async/awaitNode时。jsv8,下一个支持async/await的稳定版本将于2017年4月发布。在那之前,您可以在Node.jsv7上试验您的代码~THEEND
