实现Promise.all


Promise.all是一个静态方法,它接受一个可迭代的对象(比如数组)作为参数,并返回一个新的Promise对象。这个新的Promise对象将在可迭代对象中的所有Promise对象都成功解决后解决,并将解决值组成一个数组作为其解决值。

以下是一个简单的实现Promise.all的例子:

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    let results = [];
    let count = 0;
 
    for (let i = 0; i < promises.length; i++) {
      promises[i]
        .then((result) => {
          results[i] = result;
          count++;
 
          if (count === promises.length) {
            resolve(results);
          }
        })
        .catch((error) => {
          reject(error);
        });
    }
  });
}
在这个例子中,我们首先创建一个新的Promise对象,并在其构造函数中定义resolve和reject函数。我们还定义了一个空数组results来存储每个Promise对象的解决值,并定义了一个count变量来跟踪已成功解决的Promise对象的数量。

接下来,我们使用一个for循环遍历传递给promiseAll函数的可迭代对象,对每个Promise对象执行then方法。当一个Promise对象成功解决时,我们将其解决值存储在results数组的对应位置,并将count加1。当count等于promises数组的长度时,表示所有Promise对象都已成功解决,我们调用resolve函数并将results作为解决值传递给它。

如果其中一个Promise对象被拒绝了,我们将直接调用reject函数将错误传递给新的Promise对象,使它被拒绝。这样,我们就实现了一个简单的Promise.all函数。你可以使用它来等待多个Promise对象都成功解决后再执行一些操作。

### 自定义实现 JavaScript `Promise.all` 方法 为了创建一个类似于内置 `Promise.all()` 的功能,可以按照以下方式编写代码: #### 函数设计思路 该函数接收一个由多个 Promise 组成的数组作为参数,并返回一个新的 Promise 对象。当所有的输入 Promises 都成功解决时,这个新的 Promise 将被解析为包含所有结果的数组;如果任何一个 Promise 被拒绝,则整个过程会立即终止并抛出第一个遇到的错误。 ```javascript function myPromiseAll(promises) { return new Promise((resolve, reject) => { const results = []; let completedCount = 0; if (promises.length === 0) resolve([]); promises.forEach((promise, index) => { Promise.resolve(promise).then( value => { results[index] = value; ++completedCount; if (completedCount === promises.length) { resolve(results); } }, error => reject(error) ); }); }); } ``` 这段代码实现了基本的 `Promise.all` 功能[^1]。对于每一个传入的 Promise,都会等待其完成并将结果存储在一个临时列表中。一旦所有项目都已完成,就会调用成功的回调函数传递最终的结果集给外部使用者。 #### 使用示例 下面是一个简单的例子展示如何使用上述自定义版本的 `myPromiseAll` 来并发执行几个异步任务: ```javascript const p = new Promise((resolve, reject) => { resolve("ok"); }); const p2 = Promise.resolve("success"); const p3 = Promise.resolve("oh ok"); let result = myPromiseAll([p, p2, p3]); result.then(console.log); // 输出 ["ok", "success", "oh ok"] ``` 此段代码展示了如何利用之前定义好的 `myPromiseAll` 函数来模拟标准库中的行为[^2]。 #### 关于同步性和异步性的说明 值得注意的是,在讨论 Promise 及其相关方法(如 `.all`)的时候,理解它们的工作机制非常重要。虽然 Promise 构造器内部的操作是同步发生的,但后续链上的处理器(`.then`, `.catch`, 和其他衍生的方法)都是以异步的方式运行的。因此,尽管初始化阶段可能是即时完成的,实际的数据获取和处理仍然发生在未来的某个时间点上[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值