注意:
这个答案只涵盖了await in series和Promise.all之间的时间差异。一定要阅读@mikep的全面回答,它还涵盖了错误处理中更重要的差异。
为了回答这个问题,我将使用一些示例方法:
Res (ms)是一个接受毫秒整数的函数,并返回一个承诺,该承诺在该毫秒后解析。
Rej (ms)是一个函数,它接受一个毫秒的整数,并返回一个承诺,该承诺在这个毫秒之后被拒绝。
调用res启动定时器。使用的承诺。所有等待少量延迟的问题将在所有延迟结束后解决,但请记住它们是同时执行的:
示例# 1
const data = await Promise.all([res(3000), res(2000), res(1000)])
// ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^
// delay 1 delay 2 delay 3
//
// ms ------1---------2---------3
// =============================O delay 1
// ===================O delay 2
// =========O delay 3
//
// =============================O Promise.all
异步函数示例(){
const start = Date.now()
令I = 0
函数res(n) {
Const id = ++i
返回新的承诺((resolve, reject) => {
setTimeout(() => {
解决()
console.log(' res #${id}在${n}毫秒后调用',Date.now() - start)
}, n)
})
}
const data = await Promise.all([res(3000), res(2000), res(1000)])
console.log('的承诺。all finished ', Date.now() - start)
}
例()
这意味着承诺。3秒后,所有问题将与来自内部承诺的数据一起解决。
但是,承诺。所有这些都有“快速失败”的行为:
例# 2
const data = await Promise.all([res(3000), res(2000), rej(1000)])
// ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^
// delay 1 delay 2 delay 3
//
// ms ------1---------2---------3
// =============================O delay 1
// ===================O delay 2
// =========X delay 3
//
// =========X Promise.all
async function example() {
const start = Date.now()
let i = 0
function res(n) {
const id = ++i
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
console.log(`res #${id} called after ${n} milliseconds`, Date.now() - start)
}, n)
})
}
function rej(n) {
const id = ++i
return new Promise((resolve, reject) => {
setTimeout(() => {
reject()
console.log(`rej #${id} called after ${n} milliseconds`, Date.now() - start)
}, n)
})
}
try {
const data = await Promise.all([res(3000), res(2000), rej(1000)])
} catch (error) {
console.log(`Promise.all finished`, Date.now() - start)
}
}
example()
如果你使用async-await来代替,你将不得不等待每个promise按顺序解析,这可能不那么有效:
示例# 3
const delay1 = res(3000)
const delay2 = res(2000)
const delay3 = rej(1000)
const data1 = await delay1
const data2 = await delay2
const data3 = await delay3
// ms ------1---------2---------3
// =============================O delay 1
// ===================O delay 2
// =========X delay 3
//
// =============================X await
async function example() {
const start = Date.now()
let i = 0
function res(n) {
const id = ++i
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
console.log(`res #${id} called after ${n} milliseconds`, Date.now() - start)
}, n)
})
}
function rej(n) {
const id = ++i
return new Promise((resolve, reject) => {
setTimeout(() => {
reject()
console.log(`rej #${id} called after ${n} milliseconds`, Date.now() - start)
}, n)
})
}
try {
const delay1 = res(3000)
const delay2 = res(2000)
const delay3 = rej(1000)
const data1 = await delay1
const data2 = await delay2
const data3 = await delay3
} catch (error) {
console.log(`await finished`, Date.now() - start)
}
}
example()