学习前端同学都知道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函数体是单独解析的。