网站首页 > 博客文章 正文
手写一个类似于 JavaScript 中 Promise.all 功能的函数实现。Promise.all 的核心作用是处理多个 Promise 对象:当所有 Promise 都成功解决(resolved)时,返回一个包含所有结果的数组;如果有任何一个 Promise 被拒绝(rejected),则立即拒绝并返回拒绝原因。
下面是一个简洁的 JavaScript 代码示例,实现了一个自定义的 myPromiseAll 函数。代码中使用了基本的 Promise 机制,并考虑了边界情况(如空输入):
function myPromiseAll(promises) {
return new Promise((resolve, reject) => {
// 如果输入为空或不是可迭代对象,直接解决为一个空数组
if (!Array.isArray(promises) || promises.length === 0) {
resolve([]);
return;
}
const results = new Array(promises.length); // 存储每个 Promise 的结果
let completedCount = 0; // 计数器,跟踪已完成的 Promise 数量
promises.forEach((promise, index) => {
// 确保每个元素都被包装为 Promise(处理非 Promise 值)
Promise.resolve(promise)
.then(value => {
results[index] = value; // 存储成功结果
completedCount++;
// 当所有 Promise 都完成时,解决返回的 Promise
if (completedCount === promises.length) {
resolve(results);
}
})
.catch(error => {
reject(error); // 有任何拒绝,立即拒绝返回的 Promise
});
});
});
}
const p1 = Promise.resolve(1);
const p2 = new Promise((resolve) => setTimeout(() => resolve(2), 100));
const p3 = Promise.reject("Error occurred");
// 测试所有成功
myPromiseAll([p1, p2]).then(results => console.log(results)); // 输出: [1, 2]
// 测试有失败
myPromiseAll([p1, p3]).catch(error => console.error(error)); // 输出: "Error occurred"
这个实现的关键点:
- 高效处理异步:使用计数器确保只在所有 Promise 完成时解决。
- 错误处理:任何一个 Promise 拒绝时,立即拒绝返回的 Promise。
- 兼容性:通过 Promise.resolve 包装输入,处理非 Promise 值(如数字或字符串)。
猜你喜欢
- 2025-08-05 小词all的用法及其常用短语
- 2025-08-05 从崩溃到安稳:Promise.allSettled如何拯救我的异步请求
- 2025-08-05 Promise的九大方法
- 2025-08-05 promise 的用法及常用短语
- 2025-08-05 JavaScript 对 Promise 并发的处理方法
- 2024-08-14 Promise.all 多任务场景(等待任务全部完成后再执行后续操作)
- 2024-08-14 24届前端备战春招第9天,promise的all方法就...
- 2024-08-14 36 – 新的 Promise 方法:allSettled & any & race
- 2024-08-14 因为实现不了Promise.all,一场面试凉凉了
- 2024-08-14 Promise.all与async/await的应用(promise 和async)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- vueproxytable (64)
- npminstallsave (63)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)