I'm wondering if there's a way to determine if a function was defined using async function
or async (...) => ...
syntax?
I'm looking to implement the function isDefinedWithAsync
where:
isDefinedWithAsync(async function() { return null; }) === true;
isDefinedWithAsync(function() { return null; }) === false;
isDefinedWithAsync(async () => null) === true;
isDefinedWithAsync(() => null) === false;
Is it possible to implement isDefinedWithAsync
? And if so, how? Thanks!
I'm wondering if there's a way to determine if a function was defined using async function
or async (...) => ...
syntax?
I'm looking to implement the function isDefinedWithAsync
where:
isDefinedWithAsync(async function() { return null; }) === true;
isDefinedWithAsync(function() { return null; }) === false;
isDefinedWithAsync(async () => null) === true;
isDefinedWithAsync(() => null) === false;
Is it possible to implement isDefinedWithAsync
? And if so, how? Thanks!
2 Answers
Reset to default 8Yes,
Straight from the TC39 async/await Issues:
function isAsync(fn) {
return fn.constructor.name === 'AsyncFunction';
}
Here's a snippet that checks your 2 async
samples above and a 3rd non-async function:
function isAsync(fn) {
return fn.constructor.name === 'AsyncFunction';
}
// async functions
const foo = async () => { }
async function bar () { }
// non-async function
function baz () { }
console.log(isAsync(foo)) // logs true
console.log(isAsync(bar)) // logs true
console.log(isAsync(baz)) // logs false
But as mentioned in the rest of the ments on that issue, you shouldn't differentiate, at least conceptually, between async function
s and Promise
s since they behave the same.
Both can be await
-ed/then
-ed in the exact same way. An async
marked function always implicitly returns a Promise
.
Just an addition to Nicholas' great answer:
If you want to avoid using string parisons for type checks (due to the possibility of namespace collisions), you may be wanting to acplish the same thing with instanceof:
function isAsync(fn) {
return fn instanceof AsyncFunction;
}
In some environments you may get a ReferenceError
that "AsyncFunction is not defined".
This error can be resolved as follows:
const AsyncFunction = (async () => {}).constructor;
function isAsync(fn) {
return fn instanceof AsyncFunction;
}
Now even a silly case like the following:
isAsync({ constructor: { name: 'AsyncFunction' } });
will correctly return false
.