31

Node.JS如何按顺序调用async函数,如何判断是否为async函数,在mocha中自动化测试asyn...

 4 years ago
source link: http://ourjs.com/detail/k6srz4ue5ei8
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在Node.JS中,如果你即不喜欢回调代码嵌套,也不喜欢promise的链式写法,可以使用async/await将程序改造成顺序执行的。参见: node.js将回调函数嵌套改造成顺序执行

async/await本质上也是由Promise实现的,具体原理可在网上搜索,那么调用时和普通函数调用有何不同?

下面是一个将函数回调封装成的promise函数:

const util = require('util')

const callbackFunc = function(cb) {
  setTimeout(function() {
    console.log('async done')
    cb && cb(null, 1)
  }, 1000)
}

const asyncFunc = util.promisify(callbackFunc)

const asyncCall = async function() {
  let result = await asyncFunc()
  console.log(result)
}

如果直接调用:

asyncCall();
console.log(2);

输出结果可能跟你想的不太一样,输出结果先输出了 2:

2
async done
1

有很多方法可以解决这个问题.

使用async函数调用

因为 await 只能在async中调用,因此可以

(async () => {

  await asyncCall()
  console.log(2)

})();

输出结果正常

async done
1
2

使用promise调用

async函数本质上返回了一个promise函数,在没有async修饰的普通函数中可以:

asyncCall()
 .then(() => {
   console.log(2)
 })

还可以使用async和回调相结合:

const asyncCall = async function(cb) {
 let result = await asyncFunc()
 console.log(result)
 cb && cb()
}

asyncCall(function() {
 console.log(2)
})

只此只要事先判断是否为async函数,就能使用恰当的调用方法。那么如何判断这个函数是否为async的呢?

判断是否为async函数

使用util

可使用 util 内置的判断判断方法来判断:

const util = require('util')
util.types.isAsyncFunction(function foo() {}); // Returns false
util.types.isAsyncFunction(async function foo() {}); // Returns true

使用构造函数

也可使用 constructor.name 来判断

const isAsync = myFunction.constructor.name === "AsyncFunction";

在mocha中使用async

使用mocha自动化测试时,已经完全支持async函数,不过使用上略有不同。

传统函数需要伟入回调并执行:

it('test callbak', function(done) {
  ...
  done()
})

async不需要传递回调函数,会自动处理error

it('test async', async function() {
  ...
})

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK