admin管理员组

文章数量:1307836

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!

Share Improve this question edited Apr 30, 2018 at 14:34 nicholaswmin 23k16 gold badges101 silver badges173 bronze badges asked Apr 30, 2018 at 14:17 Gershom MaesGershom Maes 8,1783 gold badges41 silver badges61 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 8

Yes,

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 functions and Promises 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.

本文标签: javascriptDetermine if function was defined with quotasyncquotStack Overflow