实现 Promise.all

对于 all 方法而言,需要完成下面的核心功能:

  1. 传入参数为一个空的可迭代对象,则直接进行resolve
  2. 如果参数中有一个promise失败,那么Promise.all返回的promise对象失败。
  3. 在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组

具体实现如下:

  1. Promise.all = function(promises) {
  2. return new Promise((resolve, reject) => {
  3. let result = [];
  4. let len = promises.length;
  5. if(len === 0) {
  6. resolve(result);
  7. return;
  8. }
  9. const handleData = (data, index) => {
  10. result[index] = data;
  11. // 最后一个 promise 执行完
  12. if(index == len - 1) resolve(result);
  13. }
  14. for(let i = 0; i < len; i++) {
  15. // 为什么不直接 promise[i].then, 因为promise[i]可能不是一个promise
  16. Promise.resolve(promise[i]).then(data => {
  17. handleData(data, i);
  18. }).catch(err => {
  19. reject(err);
  20. })
  21. }
  22. })
  23. }

实现 Promise.race

race 的实现相比之下就简单一些,只要有一个 promise 执行完,直接 resolve 并停止执行。

  1. Promise.race = function(promises) {
  2. return new Promise((resolve, reject) => {
  3. let len = promises.length;
  4. if(len === 0) return;
  5. for(let i = 0; i < len; i++) {
  6. Promise.resolve(promise[i]).then(data => {
  7. resolve(data);
  8. return;
  9. }).catch(err => {
  10. reject(err);
  11. return;
  12. })
  13. }
  14. })
  15. }

到此为止,一个完整的 Promise 就被我们实现完啦。

参考文章

三元博客