关于javascript:如何判断Javascript函数是否是Async函数

11次阅读

共计 1256 个字符,预计需要花费 4 分钟才能阅读完成。

判断 Javascript 函数是否是 Async 函数有好几种办法:

  1. 调用Object.prototype.toString.call(async function(){}), 如果返回[object AsyncFunction],则阐明是 Async 函数。
  2. 简略地调用asyncFn.toString()

     async function myAsyncFunc(){}
    myAsyncFunc.toString()   // 后果 ="async function myAsyncFunc(){}"

asyncFn.toString()间接返回函数定义字符, 只有判断是否以 async 结尾 即可。

以上算是比拟规范的办法,在原生反对 ES6/7/ 8 以下的浏览器中是没有问题的,然而在启用了 Babel 转码 后就 有效 了。比方在 Babel7 中, async function myAsyncFunc(){}会被转码成:


function myAsyncFunc() {
    ....
    return _regenerator.default.async(function myAsyncFunc$(_context) {.....}
}

因而,如果还是用上述办法就有效了。因为被 Babel 转码后,所有的 async 均被转成一般的函数。
例如在 React Native 环境就启用了 Babel 转码,调用 Object.prototype.toString.call(async function(){}), 如果返回的是[Object Function]
因为在很多场景下咱们会启用 Babel 转码. 因而,判断是否是 Async 函数,须要思考此状况。
根本办法就是通过 asyncFunc.toString() 获取到函数内容,判断 Babel 转码后的 async 函数特色即可。

export function isAsyncFunction(fn){let fnStr =fn.toString()     
    return Object.prototype.toString.call(fn) === '[object AsyncFunction]' || fnStr.includes("return _regenerator.default.async(function")
}

须要留神的是,async 函数经 Babel 5/6/7 经转码后生成的代码,在不同的版本下可能是不一样的,甚至也不排除将来 Babel 8 转码的后果也会发生变化。因而,此办法并不一定牢靠,有谁晓得更加规范通用的办法能够告知一下。

因为 Babel 转码的状况存在,因而像判断一个对象是否是 Class 的函数,也存在相似因 Babel 转码导致的问题。例如:

function isClass(obj){if (typeof(cls) === 'function' && cls.prototype) {
        try {cls.arguments && cls.caller;} catch(e) {return true;}
    }
    return false;
}

以上函数在经 Babel 转码的状况下是有效的,如果适应 Babel 转码的状况,也一样要进行解决。

正文完
 0