Promise.all()
函数 将一组 Promise 转换为单个 Promise, 实现 当原始数组中的所有,这是一个使用示例 Promise.all()
包装一系列 Promise:
// `p1` is immediately fulfilled with value `1`
const p1 = Promise.resolve(1);
// `p2` will be fulfilled with value `2` after 100ms
const p2 = new Promise(resolve => setTimeout(() => resolve(2), 100));
const pAll = Promise.all([p1, p2]);
pAll instanceof Promise; // true
const arr = await pAll;
Array.isArray(arr); // true
arr[0]; // 1
arr[1]; // 2
异步函数的并行执行
当与 异步函数 , Promise.all()
允许您并行执行代码。 传递一个数组 async
函数调用 Promise.all()
,JavaScript 将并行执行异步函数,假设你有两个异步函数 getName()
和 getAge()
,这是您可以使用的方法 Promise.all()
并行执行它们:
async function getName() {
await new Promise(resolve => setTimeout(resolve, 200));
return Jean-Luc Picard;
}
async function getAge() {
await new Promise(resolve => setTimeout(resolve, 200));
return 59;
}
const start = Date.now();
const [name, age] = await Promise.all([getName(), getAge()]);
const end = Date.now();
name; // Jean-Luc Picard
age; // 59
end - start; // Approximately 200
错误案例
如果其中一个 Promise 被拒绝,则返回的 Promise Promise.all()
立即以相同的错误拒绝。
const success = new Promise(resolve => setTimeout(() => resolve(OK), 100));
const fail = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error(Oops)), 100);
});
try {
await Promise.all([success, fail]);
} catch (err) {
err.message; // Oops
}
请注意,由于 Promise 不可取消,因此每个单独的 Promise 都会继续执行,即使其中一个错误出错。 如果您传递一组异步函数并且其中一个异步函数抛出错误, Promise.all()
将立即拒绝该错误。但其他功能将继续执行。
let finished = false;
const success = async function() {
await new Promise(resolve => setTimeout(resolve, 100));
finished = true;
return OK;
}
const fail = async function() {
await new Promise(resolve => setTimeout(resolve, 10));
throw new Error(Oops);
}
try {
await Promise.all([success(), fail()]);
} catch (err) {
err.message; // Oops
// `Promise.all()` fails fast because `fail()` threw an
// error, but `success()` is still running.
finished; // false
// If you wait, `success()` will set `finished`
await new Promise(resolve => setTimeout(resolve, 100));
finished; // true
}
Getting Fancy with Generators
Promise.all()
函数不限制您使用数组,第一个参数可以是 任何 JavaScript iterable 。 数组是可迭代的,生成器函数也是如此。 这意味着您可以传入一个产生承诺的生成器,并且 Promise.all()
会将所有产生的 Promise 捆绑到一个 Promise 中。
const generatorFn = function*() {
for (let i = 1; i <= 5; ++i) {
yield Promise.resolve(i);
}
}
const arr = await Promise.all(generatorFn());
arr; // [1, 2, 3, 4, 5]
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
请登录后查看评论内容