Разве промежуточные асинхронные функции не должны всегда заключаться в ключевое слово `async` в Javascript? - PullRequest
0 голосов
/ 24 октября 2019

В приведенном ниже примере кода функция a возвращает обещание. Использование await после возврата - бесполезно , но я подумал (и согласно примерам ), что функция, возвращающая обещание, все равно должна быть функцией async. Однако, даже если я не добавлю ключевое слово async к a, оно все равно будет работать, если оно await редактируется в функции b. Если я не жду a() внутри b, тогда bRes - это объект обещания, а не 5. Таким образом, это означает, что у меня может быть бесконечное количество функций, таких как a, которые возвращают обещание, и до тех пор, пока первая функция, которая вызывает эту бесконечную цепочку await, дает результат, тогда мне не нужно заключать промежуточные функции вasync?

const getPromise = () => new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('promise finished')
    resolve(5)
  }, 2000)
})

const a = () => {
  console.log('from a')
  return getPromise()
}

const b = async () => {
  const bRes = await a()
  console.log('bRes', bRes)
}

b()

Ответы [ 2 ]

2 голосов
/ 24 октября 2019
  • Вы можете использовать await только внутри функции, которая async
  • Функция, которая async вернет обещание
  • Другие средства (такие как new Promise) может использоваться для создания обещания
  • Вы можете только (с пользой) await обещание

Поскольку a() возвращает обещание, а b - async, вы можете await вернуть значение a() внутри b.

1 голос
/ 24 октября 2019

Никакой функции не нужно использовать ключевое слово async, если в нем не используется ключевое слово await.

Ключевое слово await не будет работать, если используется вне функций, отмеченных async. И это единственное техническое использование ключевого слова async (если вы хотите использовать его в целях документирования, это нормально, но в противном случае оно ничего не делает).

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

...