Promise 原理分析

发布于 2024-10-30 15:30:33 字数 2740 浏览 6 评论 0

function Promise(executor){ //executor 执行器
    let self = this;
    self.status = 'pending'; //等待态
    self.value  = undefined; // 表示当前成功的值
    self.reason = undefined; // 表示是失败的值
    function resolve(value){ // 成功的方法
        if(self.status === 'pending'){
            self.status = 'resolved';
            self.value = value;
        }
    }
    function reject(reason){ //失败的方法
        if(self.status === 'pending'){
            self.status = 'rejected';
            self.reason = reason;
        }
    }
    executor(resolve,reject);
}

Promise.prototype.then = function(onFufiled,onRejected){
    let self = this;
    if(self.status === 'resolved'){
        onFufiled(self.value);
    }
    if(self.status === 'rejected'){
        onRejected(self.reason);
    }
}
module.exports = Promise;

https://www.jianshu.com/p/fc5030e725ae

promise.all 实现原理

方法 1 (最佳):

  • 入参: promise 数组
  • 出参: promise 数组
function promiseAll(arrayPromise){
    return new Promise((resolve,reject)=>{
        const array = []; //最终返回的数组
        let count = 0;         
        arrayPromise.forEach(async (promise,index)=>{
            array[index] = await promise().catch((err)=>{
                reject(err);     //只要其中一个 报错 那么 就抛出异常
            });
            count ++;
            if(count  === arrayPromise.length){  //结果数组长度 等于参数数组长度 并且无空 视作完成
                resolve(array);
            }
        })
    })
}

https://blog.csdn.net/qq_41709082/article/details/103293766

方法 2:

  • ​入参:promise 数组
  • ​出参:数据数组
  Promise.all = function (promises){
        return new Promise((resolve,reject) => {
          // 将迭代对象转化为数组
          promises = Array.from(promises)
          if(promises.length === 0){
            resolve([]) 
          }else{
            let result = [];
            let index = 0;
            for( let i = 0; i < promises.length; i++){
              Promise.resolve(promises[i]).then(data=>{
                result[i] = data;
                if(++index === promises.length){
                  resolve(result)
                }
              },err =>{
                reject(err)
                return          
                })
            }
          }
        })
      }

https://www.jianshu.com/p/c949d49eb641

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

总以为

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

xu362930323

文章 0 评论 0

缱倦旧时光

文章 0 评论 0

qq_eXruk9

文章 0 评论 0

遂心如意

文章 0 评论 0

guojiayue1

文章 0 评论 0

愿与i

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文