來自新手向國外技術博客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版本上試驗你的代碼~