我创建了三个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 PromiseTwo
和await 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();
})();