如何判断JS的函数为async声明的异步函数?How to determine an async JavaScript function?

作者
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;
    ...
}