多说一下 Promise.race Promise.all Promise.allSettled

  • Promise.all(promises: Iterable): Promise;

    Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果

  • Promise.race(promises: Iterable): Promise

    Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

  • Promise.allSettled(promises: Iterable): Promise<Array>

    Promise.allSettled()方法返回一个promise,该promise在所有给定的promise已被解析或被拒绝后解析,并且每个对象都描述每个promise的结果。

race 应用场景 来自vscode源码

all 和 allSettled 就不多说了。
这里记录下一race应用场景。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

// https://github.com/electron/electron/blob/fe5318d753637c3903e23fc1ed1b263025887b6a/spec-main/window-helpers.ts#L5

await Promise.race([

// still do not block more than 1s
timeout(1000),

// destroy any opened window
(async () => {
for (const window of BrowserWindow.getAllWindows()) {
if (window && !window.isDestroyed()) {
let whenWindowClosed: Promise<void>;
if (window.webContents && !window.webContents.isDestroyed()) {
whenWindowClosed = new Promise(c => window.once('closed', c));
} else {
whenWindowClosed = Promise.resolve();
}

window.destroy();
await whenWindowClosed;
}
}
})()
]);