Как узнать, является ли функция асинхронной?

Я должен передать функцию другой функции и выполнить ее как обратный вызов. Проблема в том, что иногда эта функция асинхронна, например:

async function() {
 // Some async actions
}

, поэтому я хочу выполнить await callback() или callback() в зависимости от типа функции, которую она получает.

Есть ли способ узнать тип функции ??

57
задан 25 July 2016 в 15:28

3 ответа

Hei,

Вот подход, обеспеченный David Walsh в его сообщение в блоге :

const isAsync = myFunction.constructor.name === "AsyncFunction";

За Ваше здоровье!

1
ответ дан 1 November 2019 в 16:46

В случае, если Вы используете NodeJS 10.x или позже

Использование собственная функция util .

   util.types.isAsyncFunction(function foo() {});  // Returns false
   util.types.isAsyncFunction(async function foo() {});  // Returns true

Действительно имеют в виду все проблемы от вышеупомянутого ansers все же. Функция, которая просто возвращает случайно обещание, возвратит отрицательный false.

И к тому же (из документов):

Примечание, что это только сообщает, что видит механизм JavaScript; в частности, возвращаемое значение не может соответствовать коду первоисточника, если transpilation инструмент использовался.

, Но если Вы используете async в NodeJS 10 и никаком transiplation. Это - хорошее решение.

6
ответ дан 1 November 2019 в 16:46

Можно принять в, начинаются, тот обратный вызов является обещанием:

export async function runSyncOrAsync(callback: Function) {

  let promisOrValue = callback()
  if (promisOrValue instanceof Promise) {
    promisOrValue = Promise.resolve(promisOrValue)
  }
  return promisOrValue;
}

и их в Вашем коде можно сделать это:

await runSyncOrAsync(callback)

, который решит Вашу проблему с незнанием типа обратного вызова....

0
ответ дан 1 November 2019 в 16:46

Другие вопросы по тегам:

Похожие вопросы: