为什么async await和Promise.all具有相同的运行时间



我创建了三个Promise,如下所示,并等待它们,预计它们需要6000毫秒:

let PromiseOne = new Promise(resolve => {
setTimeout(() => {
resolve('Promise One');
}, 2000);
});
let PromiseTwo = new Promise(resolve => {
setTimeout(() => {
resolve('Promise Two');
}, 2000);
});
let PromiseThree = new Promise(resolve => {
setTimeout(() => {
resolve('Promise Three');
}, 2000);
});
(async() => {
console.time();
let ResponseOne = await PromiseOne;
let ResponseTwo = await PromiseTwo;
let ResponseThree = await PromiseThree;
console.log(ResponseOne, ResponseTwo, ResponseThree);
console.timeEnd();
})();

但是,我收到了一条意外的控制台消息,如下所示。

Promise One Promise Two Promise Three
default: 2.004s

据我所知,每个等待都有2000米的运行时间。但是,事实并非如此。

在这种情况下,我上面使用async/await的代码和下面使用Promise.all的代码之间有什么区别?

let PromiseOne = new Promise(resolve => {
setTimeout(() => {
resolve('Promise One');
}, 2000);
});
let PromiseTwo = new Promise(resolve => {
setTimeout(() => {
resolve('Promise Two');
}, 2000);
});
let PromiseThree = new Promise(resolve => {
setTimeout(() => {
resolve('Promise Three');
}, 2000);
});
(() => {
Promise.all([PromiseOne, PromiseTwo, PromiseThree]).then(res => {
console.log(res);
});
})();

在这两种情况下,您都会立即构建所有Promise。在PromiseThree的声明结束后,对于这两种情况,您只剩下3个promise,每个promise在2秒钟后解析。无论脚本后面发生什么,每一个都将在2秒钟后解决。

如果使用Promise.all,则所有承诺将在2秒钟后得到解决。

如果使用async/await,等待的第一个问题将需要2秒才能解决。同时,其他两个问题将得到解决,因此执行await PromiseTwoawait PromiseThree几乎不需要任何时间——因此,总共需要2秒。

// at this point, each promise has been created and each will take 2 seconds
(async() => {
console.time();
// 2 seconds for the below line
let ResponseOne = await PromiseOne;
// after 2 seconds, all have resolved; below line takes no time at all
let ResponseTwo = await PromiseTwo;
// same as above
let ResponseThree = await PromiseOne;

如果await之后构建其他promise,而不是之前的promise,则情况会有所不同——在这种情况下,它们会像您对await所期望的那样串行运行。

let makePromise = () => new Promise(resolve => {
setTimeout(() => {
resolve();
}, 2000);
});
console.log('starting');
(async () => {
console.time();
await makePromise();
await makePromise();
await makePromise();
console.timeEnd();
})();

最新更新