作者
ZeroDoCom
分类
计算机 Compute
更新时间
Jan 26, 2023 8:00 AM
外部参考数
0
内部问题链接数
0
背景
在 ES2017 中引入了 async/await
关键词,这使得大家操作异步函数更加简单,同时也与各种编程语言中操作异步的逻辑对齐
问题
在JS中可以自由地声明一个函数是否为async函数,那么问题来了,如何判断一个函数为异步函数?
思路-函数运行前
参考了网上很多材料,发现一些问题,很多逻辑是在函数运行前,对函数做toString()
操作,然后根据aysnc
关键词进行判断。
事实上,这种方案遇到代码压缩打包之后,就会存在一些问题,可能被压缩后的函数中间还被套了一层函数,那么toString()
极有可能是对套的那层函数做的,因此,基于字符串判断的逻辑会存在一些失效的问题。
比如在Babel7
中, async function testAsyncFunc(){}
会被转码成
function testAsyncFunc() {
...
return _regenerator.default.async(function testAsyncFunc$(_context) {
...
}
}
基于这些点,我们可以有个初步的判断:运行前判断函数是否异步,存在一定难度。事实上也是这样,函数如何不运行,怎么知道返回值呢?
思路-函数运行后
异步函数运行之后,会返回一个Promise
,这个结果是没法直接用的,需要用Promise.slove()
了之后用.then
去接,或者用await
去接。
那么代码就可以按照如下方式编写,比较清晰,且适配任何场景,不会被打包压缩影响。
let resWrapper = testAsyncFunc();
let res;
if(res instanceof Promise){
res = await resWrapper;
...
}else{
res = resWrapper;
...
}