美文网首页
手写Promise

手写Promise

作者: 青城墨阕 | 来源:发表于2021-06-23 17:16 被阅读0次

1. PromiseAll

// 封装
Promise.prototype.all = function(promiseArray) {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(promiseArray)) {
      return reject(new Error('传入参数必须是数组'));
    }
    const res = [];
    const promiseNums = promiseArray.length;
    let counter = 0;
    for (let i = 0; i < promiseNums; i++) {
      Promise.resolve(promiseArray[i]).then(value => {
        counter++;
        res[i] = value;

        if (counter === promiseNums) {
          resolve(res);
        }
      }).catch(e => {
        reject(e);
      })
    }
  });
}

2. PrototypeFinally

Promise.prototype.finally = function(callback) {
  return this.then(res => Promise.resolve(callback()).then(() => res),
  err => Promise.reject(callback()).catch(() => {throw err}));
}

PromiseAll & PrototypeFinally 使用示例
// 使用
let p = new Promise((resolve, reject) => {});
const pro1 = new Promise((res, rej) => {
  setTimeout(() => {
    res('1')
  }, 1000)
});

const pro2 = new Promise((res, rej) => {
  setTimeout(() => {
    res('2')
  }, 2000)
});

const pro3 = new Promise((res, rej) => {
  setTimeout(() => {
    res('3')
  }, 3000)
});

p.all([pro1, pro2, pro3])
  .then(res => {
    console.log(res); // 3s后打印["1", "2", "3"]
  })
  .catch(e => {
    console.log(e);
  })
  .finally(res => {
    console.log('finally---'); // 打印finally---
  });

p.all(1)
    .then(res => {
      console.log(res);
    })
    .catch(e => {
      console.log(e); // Error: 传入参数必须是数组
    })
    .finally(res => {
      console.log('finally---'); // 打印finally---
    });


3. Promise.allSettled

  Promise.all_settled = function (promises) {
    return new Promise((resolve) => {
      // const promises = Array.from(iterators);
      if(!Array.isArray(promises)) {
        resolve(new Error('传入参数必须是数组'));
      }
      const num = promises.length;
      const resultList = new Array(num);
      let resultNum = 0;
      promises.forEach((promise, index) => {
        Promise.resolve(promise)
          .then((value) => {
            resultList[index] = { status: "fulfilled", value };
            if (++resultNum === num) {
              resolve(resultList);
            }
          })
          .catch((error) => {
            resultList[index] = { status: "rejected", reason: error };
            if (++resultNum === num) {
              resolve(resultList);
            }
          });
      });
    });
  };

  const resolved = Promise.resolve(42);
  const rejected = Promise.reject(-1);
  Promise.all_settled([resolved, rejected]).then((results) => {
    console.log(results);
  });
  Promise.all_settled().then((results) => {
    console.log(results);
  });
运行结果

相关文章

  • 手写Promise

    手写 Promise 我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写...

  • 手写 Promise 系列 --- 3

    在前两篇(手写 Promise 系列 --- 1)和(手写 Promise 系列 ---2) 中,达成了3个目标 ...

  • 手写Promise

    $ 正常的promise用法   $ 手写的Promise   # 测试可行性

  • 手写promise

    手写promise 带大家手写一个 promis。在手写之前我会先简单介绍一下为什么要使用promise、prom...

  • 纯手写实现自己的nodejs promise 库

    纯手写实现自己的nodejs promise 库什么是Promise?promise 链Async/Await后续...

  • 手写基础 promise

    1. 前言 玩下吧 手写 promise,看看能写成啥样 2. promise 基础结构 3. 手写`promi...

  • 手写 Promise

    一、Promise 是一个异步操作返回的对象,用来传递异步操作的消息。 Promise 介绍和使用详见: 认识并使...

  • 手写Promise

  • 手写Promise

    Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。 这篇博客有关于P...

  • 手写promise

    本章节纯粹是对promise手写实现。如果不了解promise自行了解再来学习本章知识。promise初体验首先,...

网友评论

      本文标题:手写Promise

      本文链接:https://www.haomeiwen.com/subject/cdwbyltx.html