Из всех приведенных вами примеров только второй является правильным. Причина этого в том, что Promise
- это функция конструктора (следовательно, вы используете ее с new
), которая принимает обычную функцию, а не другую Promise
в качестве аргумента.
Пример 1
Интерпретатор переводит ваш первый пример во что-то вроде этого (теоретически):
new Promise( new Promise((resolve, reject) => { ... }))
Это не то, что вы хотите, и также считается анти-паттерном. Вместо этого вам нужно:
new Promise((resolve, reject) => { ... })
Более того, кажется, что у вас уже есть функция (someHeavyJob
), которая приводит к Promise
. Почему вы хотите обернуть это в другой Promise
? Просто используйте .then
метод Promise
, возвращаемый someHeavyJob
, чтобы преобразовать все, что он вам дает.
В конце концов, у вас останется что-то вроде:
function myFunction() {
// ... some job
return someHeavyJob().
then( result => {
// ... some job with result
})
}
Пример 3
Третий пример неверен по тем же причинам. Пример 1 неверен, как с технической, так и с логической точки зрения.
Общие эмпирические правила
Не используйте async
и await
(только) в качестве средства передачи информации о том, что определенные функции асинхронны по своей природе для других людей (или вашего будущего Я) , Оба ключевых слова неявно влияют на код, который вы пишете, и заставляют его вести себя по-разному.
Попробуйте придерживаться любого из двух соглашений (используя Promise
или используя async
/ await
). Смешивайте их только в том случае, если вам это действительно нужно.
Лично я стараюсь придерживаться Promise
вместо async
/ await
, потому что они часто портят людей и - для меня - они оба не Это не приносит большой пользы, кроме того, что код выглядит «лучше». Впрочем, это только мое личное мнение.