在 JavaScript 中检查函数是否异步
How to Check if a Function is Async in JavaScript
要检查函数是否异步,请访问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
构造函数上的属性并检查AsyncFunction
构造函数是否用于创建函数。如果条件通过,那么我们就有了一个异步函数。
name
如果我们在非异步函数上
访问该属性,"Function"
则会返回该字符串。
function example() {} console.log(example.constructor.name); // 👉️ "Function"
不同的构造函数用于创建异步和非异步函数,因此我们可以很容易地判断一个函数是否是异步的。
如果您必须经常这样做,请定义一个可重用的函数。
function isAsyncFunction(func) { return func.constructor.name === 'AsyncFunction'; } const sum = async (a, b) => { return a + b; }; const subtract = (a, b) => { return a - b; }; console.log(isAsyncFunction(sum)); // 👉️ true console.log(isAsyncFunction(subtract)); // 👉️ false
该函数将另一个函数作为参数,true
如果提供的函数是异步的则返回,false
否则返回。
非异步函数也可能返回一个 Promise
请记住,非异步函数可能会返回一个承诺。
// 👇️ non-async returns Promise function example() { return new Promise(resolve => { resolve(100); }); } console.log(example()); // 👉️ Promise {} console.log(example.constructor.name); // 👉️ "Function"
该示例显示了一个返回承诺的非异步函数。
在 JavaScript 中检查函数是否返回 Promise
检查函数是否返回 Promise:
- 检查函数是否为
async
. - 或者,调用函数并检查它是否返回承诺。
- 如果满足任一条件,该函数将返回一个承诺。
// ✅ Promise check function isPromise(p) { if (typeof p === 'object' && typeof p.then === 'function') { return true; } return false; } // ✅ Check if a function's return value is a Promise function returnsPromise(f) { if ( f.constructor.name === 'AsyncFunction' || (typeof f === 'function' && isPromise(f())) ) { console.log('✅ Function returns promise'); return true; } console.log('⛔️ Function does NOT return promise'); return false; } // 👇️ Examples async function exampleAsync() {} function example() {} function examplePromise() { return new Promise(resolve => { resolve(42); }); } console.log(returnsPromise(exampleAsync)); // 👉️ true console.log(returnsPromise(example)); // 👉️ false console.log(returnsPromise(examplePromise)); // 👉️ true
代码示例中的第一个函数检查传入的值是否为 Promise。
function isPromise(p) { if (typeof p === 'object' && typeof p.then === 'function') { return true; } return false; }
第二个函数将另一个函数作为参数并检查它的返回值是否是一个 promise。
function returnsPromise(f) { if ( f.constructor.name === 'AsyncFunction' || (typeof f === 'function' && isPromise(f())) ) { console.log('✅ Function returns promise'); return true; } console.log('⛔️ Function does NOT return promise'); return false; }
语句中的第一个条件if
检查函数是否为async
。
async
函数都会返回一个 Promise,因此如果函数是,我们就知道它会返回一个 Promise。 async
Our second condition checks if the passed-in value is a function and invokes it,
passing the result to the isPromise()
function.
There are two ways to check if a function returns a promise:
- Check if the function is
async
– then it returns a promise 100% of the
time. - Check if the function’s return value is an object that has a property
then
of type function.
An alternative approach is to not check if the function returns a Promise, but
to use the Promise.resolve()
method instead.
Guarantee that the function always returns a Promise #
You can use the Promise.resolve()
method to guarantee that the function will
always return a Promise.
function example() { return 42; } Promise.resolve(example()).then(value => { console.log(value); // 👉️ 42 });
The function doesn’t return a Promise, however, we used the Promise.resolve()
method to wrap the value in a Promise.
The code sample also works if the function returns a Promise.
async function example() { return 42; } Promise.resolve(example()).then(value => { console.log(value); // 👉️ 42 });
We marked the function as async
and async
functions always return a Promise.
Either way, our code works as expected.
The
Promise.resolve
method resolves the supplied value to a Promise.
If the provided value is a Promise, then the Promise is returned, otherwise, the
method returns a Promise that is resolved with the supplied value.
If the value is not a Promise, we wrap it in one to be able to use the .then()
method.
如果该值是一个 Promise,它会按原样返回,我们仍然可以使用该.then()
方法。