来自新手向国外技术博客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来做异步编程。下面的小例子展示了如何通过FetchAPI和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版本上试验你的代码~

THE END


uglybachelor
198 声望21 粉丝

Programmer wanna-be