如何判断一个函数是否是async函数?

1,205 阅读1分钟

学习前端同学都知道async/await函数,那我们应该如何去判断一个函数是否为一个async/await函数了?

  • 如今,这里有asyncFunc函数,已经是async标识,如何判断了

async function asyncFunc() {}

我们必然是不能直接执行韩式通过函数的执行结果判断是否是一个async函数

实现方法

方法1

我们在函数的原型上可以发现一个async函数会带有一个Symbol(Symbol.toStringTag): "AsyncFunction"这样的一个属性,而普通函数是没有这样的一个属性的,因此我们可以这样写:

function isAsyncFunc(func) {
    return func[Symbol(Symbol.toStringTag)] === 'AsyncFunction';
}
  • Symbol.toStringTag其实是一个知名符号(传送门)。用于创建对象的默认字符串描述。它由 Object.prototype.toString() 方法内部访问。可以简单理解为当你调用Object.prototype.toString()你希望得到的结果可以被改变,那么你就可以使用如下方法去改变

func.prototype[Symbol(Symbol.toStringTag)] = 'SuperFunc'

Object.prototype.toString.call(func) // => '[object SuperFunc]'

方法2

  • Generator一样,async函数也是通过构造函数创建出的新异步函数对象。而且也不是一个全局对象。
let AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
async function asyncExpression(){}
let asyncFn = new AsyncFunction()
console.log(asyncExpression instanceof AsyncFunction) // true
console.log(asyncFn instanceof AsyncFunction) // true
// 但不建议这样使用new这个实例,就像创建数组直接使用字面量一样。
// 因为函数表达式更高效,异步函数是与其他代码一起被解释器解析的,而使用new函数体是单独解析的。