можно ли передавать асинхронную функцию там, где требуется несинхронная функция?

#javascript #asynchronous #async-await #callback

Вопрос:

как показано ниже, асинхронная функция была задана для параметра, где ожидалась несинхронная функция, но она работала, почему?

  function getCallback(param, callback) {  setTimeout(() =gt; {  callback amp;amp; callback(param);  }, 1); }  getCallback(13, async (param) =gt; {  console.log(param); });  --- 13   

Комментарии:

1. Потому что и async function выражения, и function выражение создают объекты вызываемых функций … Почему вы ожидали, что это не сработает?

2. getCallback ничего не делает с возвращаемым значением callback , поэтому это не влияет на то callback , возвращает обещание или нет. И возвращение обещания-это, в значительной степени, единственная отличительная особенность async функции, если смотреть со стороны.

3. Хорошо, если ваш обратный звонок вернет что-то важное. Например, если бы обратный вызов ожидал номер, он не работал бы и т. Д..

Ответ №1:

Это сработало, почему?

Потому async что функция-это просто функция, которая возвращает обещание и может быть вызвана, как и любая другая функция. Вы getCallback игнорируете возвращаемое значение callback() , поэтому не имеет значения, что оно возвращает.

Можно ли передавать async функцию там, где она не async нужна?

Нет, обычно недопустимо передавать async функцию (или другую функцию, возвращающую обещание) функции, которая не ожидает, что обратный вызов вернет обещание. Обещания не следует игнорировать, они должны быть .then() скованы цепью или await изменены, и они нуждаются в специальной обработке ошибок. Если getCallback ошибка не обрабатывает (обещает) ошибки, вы не должны передавать обратный вызов с ошибками.

Комментарии:

1. спасибо~ Я предположил, что «асинхронность» — это своего рода конструктор, который возвращает объект, подобный python.