模拟 Promise.all() 的效果

本文介绍如何使用ES3语法模拟Promise.all()的功能,通过异步函数和计数器实现并发请求并确保按顺序处理结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用es3 语法模拟 Promise.all() 的效果

// 模拟异步函数
var asyncFunc = function (aa, time, cb) {
  setTimeout(() => {
    const data = aa
    cb(aa, data)
  }, time)
}

// 结果集
var resultArr = []

// 所有异步函数执行后的最终处理函数
var finalFunc = function () {
  console.log('结束')
  console.log(resultArr)
}
// 计数器
var num = 0

// for循环模拟发送多个请求
for (var i = 0; i < 3; i++) {
  var time = Math.random() * 1000
  asyncFunc(i, time, function (index, data) {
    // 按顺序插入结果集
    resultArr[index] = data
    num++
    // 所有异步函数执行完毕执行
    if (num === 3) {
      finalFunc()
    }
  })
}

 

### 手动实现 `Promise.all` 的功能 以下是基于提供的引用内容以及专业知识,详细介绍如何手动实现 `Promise.all()` 方法的功能。 #### 实现原理 `Promise.all()` 接收一个包含多个 Promise 对象的数组作为参数,并返回一个新的 Promise 对象。当所有传入的 Promise 都变为 fulfilled 状态时,新的 Promise 将被 resolved 并返回一个按顺序排列的结果数组;如果任意一个 Promise 变为 rejected 状态,则整个过程会立即终止并返回第一个被 reject 的错误[^1]。 为了模拟这一行为,可以按照以下逻辑编写代码: 1. 创建一个新的 Promise 对象。 2. 使用计数器记录已完成的 Promise 数量。 3. 当某个 Promise 成功完成时,将其结果存储到对应位置。 4. 如果所有 Promise 均成功完成,则调用外部 resolve 函数传递结果数组。 5. 若有任一 Promise 被拒绝,则直接触发外部 reject 函数。 下面是具体的手动实现代码示例: ```javascript function myPromiseAll(promises) { return new Promise((resolve, reject) => { if (!Array.isArray(promises)) { return reject(new TypeError('Argument must be an array')); // 参数校验 } const results = []; let completedCount = 0; if (promises.length === 0) { return resolve(results); // 如果输入为空数组,直接返回空数组 } promises.forEach((promise, index) => { Promise.resolve(promise).then( (value) => { results[index] = value; completedCount++; if (completedCount === promises.length) { resolve(results); } }, (reason) => { reject(reason); // 一旦有一个 Promise 被拒绝,就立刻结束流程 } ); }); }); } // 测试代码 const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); myPromiseAll([promise1, promise2, promise3]) .then((results) => console.log(results)) // 输出: [1, 2, 3] .catch((error) => console.error(error)); ``` 此版本实现了基本功能并与原生 `Promise.all()` 行为一致[^2]。 --- ### 关键点解析 - **输入验证**: 在实际应用中应考虑对输入数据类型的检查,确保其是一个有效的数组[^3]。 - **异步处理**: 利用了 `Promise.resolve()` 来标准化每个项的行为,即使某些项并非真正的 Promise 实例也能正常工作[^4]。 - **错误捕获机制**: 即使只有一个子任务失败也会迅速反馈给调用者知道确切原因而不是等待其他未决事项继续运行下去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值