js判断函数是否为async

在 JavaScript 中,可以通过以下方法判断一个函数是否是 async 函数:

方法 1:使用 Object.prototype.toString

async 函数的类型标签是 "[object AsyncFunction]",可以利用这一点来判断。

function isAsyncFunction(func) {
    return Object.prototype.toString.call(func) === '[object AsyncFunction]';
}

// 示例
async function myAsyncFunction() {}
function myNormalFunction() {}

console.log(isAsyncFunction(myAsyncFunction)); // true
console.log(isAsyncFunction(myNormalFunction)); // false

方法 2:检查函数的 constructor.name

async 函数的构造器名称是 "AsyncFunction",可以通过检查 constructor.name 来判断。

function isAsyncFunction(func) {
    return func && func.constructor && func.constructor.name === 'AsyncFunction';
}

// 示例
async function myAsyncFunction() {}
function myNormalFunction() {}

console.log(isAsyncFunction(myAsyncFunction)); // true
console.log(isAsyncFunction(myNormalFunction)); // false

方法 3:直接与 AsyncFunction 构造器比较

JavaScript 提供了一个内置的 AsyncFunction 构造器,可以直接用来判断。

function isAsyncFunction(func) {
    return func instanceof AsyncFunction;
}

// 示例
async function myAsyncFunction() {}
function myNormalFunction() {}

console.log(isAsyncFunction(myAsyncFunction)); // true
console.log(isAsyncFunction(myNormalFunction)); // false

注意事项

  1. AsyncFunction 并未直接暴露在全局作用域
    虽然 AsyncFunction 是 JavaScript 内置的构造器,但它并未直接挂载到全局对象(如 windowglobal)上。如果你尝试直接访问 AsyncFunction,可能会报错。因此,推荐使用前两种方法。

  2. 箭头函数的特殊情况
    如果你用箭头函数定义 async 函数,这些方法同样适用。

    const asyncArrow = async () => {};
    console.log(isAsyncFunction(asyncArrow)); // true
    
  3. 普通函数和异步函数的区别
    普通函数不会返回 Promise,而 async 函数始终返回一个 Promise 对象。但这种方法不能作为判断依据,因为普通函数也可能返回 Promise


以上三种方法都可以有效判断一个函数是否为 async 函数,选择其中一种适合你的场景即可!

posted @ 2025-04-16 21:14  龙陌  阅读(95)  评论(0)    收藏  举报