Javascript如何判断是否是async函数。
1.使用Symbol.toStringTag
function isAsyncFunction (fn){
return fn[Symbol.toStringTag] === 'AsyncFunction'
}
console.log(isAsyncFunction(()=>{}));
console.log(isAsyncFunction(async ()=>{}));
console.log(isAsyncFunction(()=>{ return Promise.resolve() }));
运行结果:
false
true
false
2.使用Object.prototype.toString.call
我们知道可以使用Object.prototype.toString获得一个对象的原型类型,但是这种情况仅仅对javascript内置对象类型起作用,用户自定义的类型还是为Object。
class A{
}
const a = new A();
//测试数组类型
console.log(Object.prototype.toString.call([]));
//测试用户自定义类型
console.log(Object.prototype.toString.call(a));
运行结果:
[object Array]
[object Object]
我们可以在prototype上添加Symbol.toStringTag属性。
class A{
}
const a = new A();
A.prototype[Symbol.toStringTag] = 'A';
console.log(Object.prototype.toString.call([]));
console.log(Object.prototype.toString.call(a));
运行结果:
[object Array]
[object A]
这样,咱们把isAsyncFunction 函数改写为使用Object.prototype.toString实现。
function isAsyncFunction (fn){
return Object.prototype.toString.call(fn) === '[object AsyncFunction]';
}
console.log(isAsyncFunction(()=>{}));
console.log(isAsyncFunction(async ()=>{}));
console.log(isAsyncFunction(()=>{ return Promise.resolve() }));
运行结果:
false
true
false