← 返回首页
判断是否是Async函数
发表时间:2023-02-11 11:07:30
判断是否是Async函数

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