首页 > 编程语言 >如何判断Javascript函数是否是Async函数

如何判断Javascript函数是否是Async函数

时间:2022-11-03 22:36:42浏览次数:68  
标签:function 函数 转码 Babel Javascript toString async Async

 

zhangfisher发布于 2021-04-13

判断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转码的情况,也一样要进行处理。

标签:function,函数,转码,Babel,Javascript,toString,async,Async
From: https://www.cnblogs.com/sexintercourse/p/16856061.html

相关文章

  • C++静态成员和静态函数的正例和反例
      上图所示的代码都是正确的、并且能够按正常人的预期执行。首先提示一点、C++要用类名调用静态函数或者引用变量时、不是像Java一样用点号、而是用两个冒号! 错误......
  • C++中const修饰的成员函数
    const成员函数的格式:只要在函数后加上一个const就可以了TypeClassName::function(Typep)constintgetFoot(void)const{returnthis->foot; }https://blog.5......
  • 协程的async使用
    async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job async函数类似于launch函数.它启动了一个单独的协程,这是一个轻量级的线程......
  • Python获取当前运行函数的名称、类方法名称
    获取函数的名称在函数外部获取函数的名称,可以使用.__name__来获取。deftest_func_name1(): print('test')func_name1=test_func_name1.__name__print(func_name1......
  • MySQL的rank排名函数
    ROW_NUMBERselectemployeeIdsalaryrow_number()over(orderbysalarydesc)asrankfromemployee;此语句会帮我们另起一行为rank,而且按照顺序排好序,类似(1,2,3,4...)RANK......
  • 累积分布函数CDF
    累积分布函数/分布函数:是概率密度函数的积分,能完整描述一个实随机变量X的概率分布。一般以大写“CDF”(CumulativeDistributionFunction)标记。定义:对于所有实数,累积分......
  • shell之函数表示方法
    ​​共有三种表示方法,分别如下:​​1.function+函数名()+{}functionpxe_config(){xxxxxxxxxxxxx}2.function+函数名+{}functionpxe_config{xxxxxxxxxxxxx}3.函......
  • javascript - 练习题:浅层克隆和深层克隆
    浅层克隆问:把obj 对象的内容,克隆到ojb1 上去。 varobj={name:'abc',age:123,sex:"female"}varobj1={}分析:这个没有引用值的对象,可以使用浅层克隆......
  • React 函数组件
    React函数组件1、定义方式React函数组件是指使用函数方法定义的组件。定义方式:与函数的定义方式相同,需要将内容return出来,需要注意的是最外层只有一个标签或者使用......
  • C++ 通用的 toString() 函数
    1#include<iostream>2#include<string>34namespacestr_utils{56std::stringto_string(constchar*c_str){7std::cout<<"调用了......