如何在 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 块运行。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。