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

栏目: IT技术 · 发布时间: 4年前

内容简介:在Node.JS中,如果你即不喜欢回调代码嵌套,也不喜欢promise的链式写法,可以使用async/await将程序改造成顺序执行的。参见:async/await本质上也是由Promise实现的,具体原理可在网上搜索,那么调用时和普通函数调用有何不同?下面是一个将函数回调封装成的promise函数:

在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() {
  ...
})

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言编程:一本全面的C语言入门教程(第三版)

C语言编程:一本全面的C语言入门教程(第三版)

(美)Stephen Kochan / 张小潘 / 电子社博文视点资讯有限公司 / 2006年 / 59.00元

本书是极负盛名的C语言入门经典教材,其第一版发行至今已有20年的历史。本书内容详实全面,由浅入深,示例丰富,并在每个章节后面附有部分习题,非常适合读者自学使用。除此之外,《C语言编程》一书对于C语言标准的最新进展、C语言常见开发工具以及管理C语言大型项目等重要方面,也进行了深入浅出的说明。一起来看看 《C语言编程:一本全面的C语言入门教程(第三版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器