来自新手向国外技术博客RisingStack的又一篇Node.js相关技术文章,原文请看此。javascript
几个月前,JavaScript引擎V8加入了async/await特性。Node.js也随之更新它的V8版本,最新的Nightly版本终于加入了async/await特性的V8引擎。java
注意:目前async/await特性只在非稳定版本的Nightly中才有。暂时建议不要用于生产环境。node
首先,咱们来看看如何用Promise
来作异步编程。下面的小例子展现了如何经过Fetch
API和Promise
获取数据:git
function getTrace () { return fetch('https://trace.risingstack.com', { method: 'get' }) } getTrace() .then() .catch()
经过使用async/await,可在Promise
中实现await
功能。意思是它能以非阻塞的方式暂定代码的执行,以等待上一个结果返回。若是这个promise
最终的状态不是resolved
而是rejected
,它会将rejected
的值抛出异常,能够用try/catch
块捕获。github
若是把上面的例子用async/await实现,会是下面这样:web
async function getTrace () { let pageContent try { pageContent = await fetch('https://trace.risingstack.com', { method: 'get' }) } catch (ex) { console.error(ex) } return pageContent } getTrace() .then()
要了解更多关于async/await的信息,推荐下面两篇文章:编程
首先,要获取最新的Nightly builds。app
若是你使用nvm的话,可使用下面的方式安装:
NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly nvm install 7 nvm use 7
先来建立一个简单的JavaScript文件,用setTimeout
实现一个函数的延迟执行,而且用async/await来调用。
// app.js const timeout = function (delay) { return new Promise((resolve, reject) => { setTimeout(() => { resolve() }, delay) }) } async function timer () { console.log('timer started') await Promise.resolve(timeout(100)); console.log('timer finished') } timer()
文件建立好以后,试下运行它:
node app.js
不过这样是不行的,由于async/await目前还须要特殊的方式执行,以下所示:
node --harmony-async-await app.js
以Koa v2为例,Koa如今支持中间件形式的异步函数。在此以前,还它只能经过转译器来实现。
你能够以中间件形式简单地传入一个异步函数:
// app.js const Koa = require('koa') const app = new Koa() app.use(async (ctx, next) => { const start = new Date() await next() const ms = new Date() - start console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) }) app.use(ctx => { ctx.body = 'Hello Koa' }) app.listen(3000)
像这样,就用Koa建立了一个服务器,接下来运行它:
node --harmony-async-await app.js
Node.js v8,下一个稳定版本,且会支持async/await功能将于2017年4月发行。在那以前,你均可以在Node.js v7版本上试验你的代码~