如何在 JavaScript 中检查函数是否异步

要检查函数是否异步,请访问函数的 constructor.name 属性并检查该值是否等于 AsyncFunction,例如 myFunction.constructor.name === ‘AsyncFunction’。 如果相等性检查返回 true,则该函数是异步的。

const sum = async (a, b) => {
  return a + b;
};

if (sum.constructor.name === 'AsyncFunction') {
  // ?️ this runs
  console.log('✅ function is async');
} else {
  console.log('⛔️ function is NOT async');
}

访问函数时,constructor属性返回:

  • 非异步函数的函数构造函数
  • 异步函数的 AsyncFunction 构造函数

JavaScript 中的每个异步函数都是一个 AsyncFunction 对象。

如果条件通过,那么我们就有了一个异步函数。

如果我们访问非异步函数的 name 属性,则会返回字符串“Function”。

function example() {}

console.log(example.constructor.name); // ?️ "Function"

不同的构造函数用于创建异步和非异步函数,因此我们可以很容易地判断一个函数是否是异步的。

// ?️ non-async returns Promise
function example() {
  return new Promise(resolve => {
    resolve(100);
  });
}

console.log(example()); // ?️ Promise {}

console.log(example.constructor.name); // ?️ "Function"

该示例显示了一个返回承诺的非异步函数。

我们可以通过以下方式检查函数的返回值是否为 Promise。

function example() {
  return new Promise(resolve => {
    resolve(100);
  });
}

function isPromise(p) {
  if (typeof p === 'object' && typeof p.then === 'function') {
    return true;
  }

  return false;
}

console.log(isPromise(example())); // ?️ true
console.log(isPromise(() => {})); // ?️ false

我们检查传入的值是否是一个对象,并且它包含一个名为 then 的属性,该属性属于函数类型。

大多数时候你不能仅仅调用函数来检查它们的返回值是什么,因为它们可能正在改变状态,例如 在数据库中。

if (
  example.constructor.name === 'AsyncFunction' ||
  (typeof example === 'function' && isPromise(example()))
) {
  console.log('✅ Function returns promise');
} else {
  console.log('⛔️ Function does NOT return promise');
}

我们的 if 语句检查函数是异步的还是返回一个 promise。 如果任一检查通过,则 if 块运行。