基本介绍
**全部成功** 当所有输入的 Promise 都成功解析(resolve)时,返回的 Promise 才会解析。解析结果是一个数组,顺序与输入一致。 **快速失败** 如果任意一个 Promise 被拒绝(reject),返回的 Promise 会立即拒绝,并携带第一个拒绝的原因。 **非取消机制** 即使某个 Promise 失败,其他 Promise 仍会继续执行,只是结果会被忽略。
**结果顺序** 输出数组的顺序与输入顺序一致,与各个 Promise 的完成顺序无关。 **参数处理** 非 Promise 值会被 Promise.resolve 转换为 Promise。 **错误传递** 第一个拒绝的 Promise 会直接触发整体拒绝。
Promise.all(iterable);
使用示例
const p1 = Promise.resolve(1);
const p2 = 42; //非 Promise,会被转换为 Promise.resolve(42)
const p3 = newPromise((resolve) => setTimeout(resolve, 100, 'foo'));
Promise.all([p1, p2, p3])
.then((results) => {
console.log(results); //输出:[1, 42, 'foo']
});
const p1 = Promise.resolve('成功');
const p2 = Promise.reject('失败');
Promise.all([p1, p2])
.catch((error) => {
console.error(error); // 输出:'失败'
});
使用场景
**需求** 前端需要同时获取用户信息、订单列表和消息通知,并在所有数据就绪后渲染页面。
const userPromise = fetch('/api/user');
const ordersPromise = fetch('/api/orders');
const notificationsPromise = fetch('/api/notifications');
Promise.all([userPromise, ordersPromise, notificationsPromise])
.then((responses) =>Promise.all(responses.map(res => res.json())))
.then(([user, orders, notifications]) => {
renderPage(user, orders, notifications);
})
.catch((error) => {
showError('部分数据加载失败,请重试');
});
**需求** 读取多个文件内容,合并后写入新文件。
const fs = require('fs').promises;
const files = ['file1.txt', 'file2.txt', 'file3.txt'];
const readPromises = files.map(file => fs.readFile(file, 'utf8'));
Promise.all(readPromises)
.then((contents) => {
const merged = contents.join('\n');
return fs.writeFile('merged.txt', merged);
});
**需求** 表单提交前需异步验证用户名、邮箱和手机号,全部通过才允许提交。
const validateUsername = (name) => fetch('/validate/username?name=' + name);
const validateEmail = (email) => fetch('/validate/email?email=' + email);
const validatePhone = (phone) => fetch('/validate/phone?phone=' + phone);
Promise.all([
validateUsername('Alice'),
validateEmail('alice@example.com'),
validatePhone('1234567890')
])
.then(() => submitForm())
.catch(() => {
alert('验证未通过,请检查输入');
});
**错误处理** 使用 .catch 或 try/catch(配合 async/await)捕获首个错误。 **资源竞争** 并行操作可能占用较多资源(如高并发请求),需考虑服务端压力。 **部分成功需求** 若需处理部分成功的情况,改用 Promise.allSettled。
**Promise.race** 返回第一个完成的 Promise(无论成功/失败)。 **Promise.allSettled** 等待所有 Promise 完成,收集全部结果(包含成功和失败)。

本文作者:赵 卓(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




