来自新手向国外技术博客RisingStack的又一篇Node.js相关技术文章,原文请看此。
正文
Node.js v7的async/await实践
几个月前,JavaScript引擎V8加入了async/await特性。Node.js也随之更新它的V8版本,最新的Nightly版本终于加入了async/await特性的V8引擎。
注意:目前async/await特性只在非稳定版本的Nightly中才有。暂时建议不要用于生产环境。
什么是async/await?
首先,我们来看看如何用Promise
来做异步编程。下面的小例子展示了如何通过Fetch
API和Promise
获取数据:
function getTrace () {
return fetch('https://trace.risingstack.com', {
method: 'get'
})
}
getTrace()
.then()
.catch()
通过使用async/await,可在Promise
中实现await
功能。意思是它能以非阻塞的方式暂定代码的执行,以等待上一个结果返回。如果这个promise
最终的状态不是resolved
而是rejected
,它会将rejected
的值抛出异常,可以用try/catch
块捕获。
如果把上面的例子用async/await实现,会是下面这样:
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的信息,推荐下面两篇文章:
在不使用转译器的情况下,使用async/await
1. 安装Node.js v7
首先,要获取最新的Nightly builds。
如果你使用nvm的话,可以使用下面的方式安装:
NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly
nvm install 7
nvm use 7
2. 用async/await运行个文件试试
先来创建一个简单的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
3. 用async/await创建web服务器
以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
何时可以开始使用async/await
Node.js v8,下一个稳定版本,且会支持async/await功能将于2017年4月发行。在那之前,你都可以在Node.js v7版本上试验你的代码~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。