Node.js es7标准中加入了async/await用于处理异步函数。 async
标记的函数中方能调用await
, await
用于等待异步函数的返回值, 而await
目标必须是一个promise
对象, 因此实际上await
就是对promise
对象取它的resolve
值。
使用babel-node运行es7代码
1 | npm install -g babel-cli |
然后添加.babelrc
文件,添加以下内容:
1 | { |
此时就可以使用babel-node app.js
运行es7代码了。
另一种方式
1 | npm install babel-core babel-polyfill --save |
在程序入口文件 index.js
中:
1 | require('babel-core/register') |
这样一来也可以在app.js
或其他文件中编写es7代码了。
传统的Promise生成
【示例代码1】
1 | function readWithPromise(filePath) { |
这段代码就是一返回一个promise对象,它的作用是读取一个文件的内容,因此我们要调用时只需要如下操作:
【示例代码2】
1 | async function run() { |
以Generator方式
除此之外,还有一种生成promise
对象的方法, 那便是generator
, 使用这种方法需要引用co
这个包, 代码如下:
【示例代码3】
1 | import co from 'co'; |
【示例代码1】
与【示例代码3】
作用完全一样, 最后它们都返回一个promise
对象,因此调用方式也一样(见【示例代码2】
).
小结
await
仅仅只是es7
加入的默认对promise
的一种处理机制而已,它的作用其实类似于generator
里面的yield
。yield
后面加的可以是一个generator
函数,也可以是promise
对象,甚至可以是一个promise
数组等;而await
后面接的只能是一个promise
对象,但它们都会在此等待结果返回后才会执行之后的代码。