promise.all的手写实现

一、promise.all 的使用

let promise1 = new Promise(function(resolve) {
  resolve(1);
});
let promise2 = new Promise(function(resolve) {
  resolve(2);
});
let promise3 = new Promise(function(resolve) {
  resolve(3);
});

let promiseAll = Promise.all([promise1, promise2, promise3]).then(function(res) {
  console.log(res);
});

二、实现

简化版本

Promise.all = function(promises) {
  let results = [];
  return new Promise(function(resolve) {
      promises.forEach(function(val) {
      // 按顺序执行每一个Promise操作
      val.then(function(res) {
        results.push(res);
      });
    });
    resolve(results);
  });
}

这是最简化的版本,但是也有两个问题。一、Promise.all传递的参数可能不是Promise类型,可能不存在then方法。二、如果中间发生错误,应该直接返回错误,不执行后面操作。

升级版本:

Promise.prototype.all = function(promises) {
  let results = [];
  let promiseCount = 0;
  let promisesLength = promises.length;
  return new Promise(function(resolve, reject) {
    for (let val of promises) {
      Promise.resolve(val).then(function(res) {
        promiseCount++;
        // results.push(res); 应该用下标 而不是push
        results[i] = res;
        // 当所有函数都正确执行了,resolve输出所有返回结果。
        if (promiseCount === promisesLength) {
          return resolve(results);
        }
      }, function(err) {
        return reject(err);
      });
    }
  });
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在提供的代码中,已经实了一个自定义的`promiseAll`函数来模拟`Promise.all`的功能。以下是对代码的解释和改进建议。 首先,在代码中定义了`isReadFile`函数,它返回一个`Promise`对象,用于读取文件。这是一个很好的实践,可以将其作为`Promise`的包装器来处理异步操作。 接着,在测试代码中创建了三个`Promise`对象`p1`,`p2`和`p3`,分别用于读取文件`1.txt`,`2.txt`和`3.txt`。然后将这些`Promise`对象作为参数传递给`promiseAll`函数。 需要注意的是,由于在读取文件`3.txt`时发生了错误,因此`p3`应该被拒绝,并返回一个错误消息。 接下来,可以通过以下方式改进代码: 1. 在错误处理中使用`reject`函数来传递实际的错误对象,而不仅仅是一个字符串错误消息。这样可以更好地捕获和处理错误。 2. 在`promiseAll`函数中,使用`Promise.resolve`来确保传递给`promiseAll`的参数是一个`Promise`对象数组。这样可以在实际参数是一个`Promise`对象时,不用动包装成数组。 3. 在`promiseAll`函数中,使用`Promise.all`来处理传入的`promises`数组。这样可以更好地处理并发的异步操作,并且能够正确处理其中一个`Promise`对象失败的情况。 以下是改进后的代码示例: ```javascript const fs = require('fs'); function isReadFile(file) { return new Promise((resolve, reject) => { fs.readFile(file, "utf8", (err, data) => { if (err) { return reject(err); } resolve(data); }); }); } function promiseAll(promises) { return Promise.all(promises); } let p1 = isReadFile('1.txt'); let p2 = isReadFile('2.txt'); let p3 = isReadFile('3.txt'); promiseAll([p1, p2, p3]).then( res => { console.log(res); }, err => { console.log(err); } ); ``` 以上代码中,已经对错误处理进行了改进,并且使用了`Promise.resolve`和`Promise.all`来优化`promiseAll`函数的实。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [promise.all](https://blog.csdn.net/weixin_54217534/article/details/125471928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值