Добавление двух ожидаемых обещаний может выполняться или не выполняться параллельно, в зависимости от того, когда вы их инициализируете.Если вы инициализируете их в самом операторе сложения, они будут выполняться последовательно;первый работает, затем, когда это сделано, второй работает.Смотри:
const p1 = () => new Promise((resolve, reject) => {
setTimeout(() => {
console.log('p1')
resolve(200)
}, 5000)
})
const p2 = () => new Promise((resolve, reject) => {
setTimeout(() => {
console.log('p2')
resolve(100)
}, 3000)
})
async function start() {
const result = await p1() + await p2()
console.log(result)
Promise.all([p1(), p2()])
}
start()
Если сложить ожидаемые обещания вместе, чтобы они выполнялись последовательно, вы увидите, что p2
завершится раньше, чем p1
.Это не тот случай.Однако, когда вы запускаете их с помощью Promise.all, вы видите, что p2
заканчивается первым.
Как указал @Kaiido в комментариях, OP показывает запуск обещаний перед ожиданием их добавления вместе.В этом случае они будут работать параллельно:
const P1 = () => new Promise((resolve, reject) => {
setTimeout(() => {
console.log('p1')
resolve(200)
}, 5000)
})
const P2 = () => new Promise((resolve, reject) => {
setTimeout(() => {
console.log('p2')
resolve(100)
}, 3000)
})
async function start() {
const p1 = P1()
const p2 = P2()
const result = await p1 + await p2
console.log(result)
}
start()
Вы увидите, что p2 заканчивается до p1.Так что вы правы, функционально разницы нет.Поэтому, в зависимости от вашего варианта использования, они будут работать точно так же.Хотя некоторые мысли:
Я думаю, что Promise.all более понятен.Вы явно даете понять другим разработчикам (и себе в будущем), что эти обещания должны выполняться параллельно.
С Promise.all вам не нужно создавать переменные для каждого из них.обещаю.Во многих случаях Promise.all будет чище.Хотя в вашем примере сложения двух результатов, использование Promise.all, вероятно, не принесет никаких результатов:
const result = await Promise.all([p1(), p2()]
.then(([r1, r2]) => r1 + r2)