内容简介:在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() { ... })
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Python 函数调用&定义函数&函数参数
- Linux内核如何替换内核函数并调用原始函数
- gdb 如何调用函数?
- 汇编层面分析函数调用
- 理解 Golang 的函数调用
- Wasm 介绍(六):间接函数调用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。