来自新手向外洋手艺博客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版本上实验你的代码~