ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Promise静态方法实现(all race finally resolve reject)

2021-09-05 20:04:16  阅读:135  来源: 互联网

标签:resolve 静态方法 finally Promise promise reject return data


示例

// Promise.resolve()
Promise.resolve(1).then((data) => {
  console.log(data) // 1
})
// Promise.reject()
Promise.reject(2).catch((data) => {
  console.log(data) // 2
})
// Promise.all()
// 多个Promise都成功后获取结果,调用成功回调,如果有一个promise失败了,all返回的promise对象也会失败,调用失败回调
Promise.all([1, new Promise((res, rej) => { res(10) })]).then((data) => {
  console.log(data) // [1, 10]
})
// Promise.finally()不管上一个promise状态是什么 都会执行
Promise.resolve(111).finally((data) => {
  console.log(data) // undefined
  return 2;
  // return new Promise((resolve, reject) => {
  //   reject('222')
  // })
}).then(data => {
  console.log(data) // 111
}).catch(reason => {
  console.log(reason) // finally中返回失败的promise才执行
})

// race 谁最快改变状态 就执行谁的回调
Promise.race([1,3]).then(data => {
  console.log(data) // 1
}).catch(err => console.log(data))

手写实现

class MyPromise {
  static finally(callback) {
    return this.then(data => {
      // 直接调用callback()无法处理异步代码
      Promise.resolve(callback()).then(() => data)
    }, err => {
      Promise.resolve(callback()).then(() => {throw err})
    })
  }
  static all(args) {
    let results = [];
    let promiseCount = 0;
    let promisesLength = promises.length;
    return new Promise(function(resolve, reject) {
      for (let val of promises) {
        // 将普通值也包装成promise来处理
        Promise.resolve(val).then(function(res) {
          // 记录当前执行了几个promise
          promiseCount++;
          // 成功回调的参数存放到结果数组中
          results[i] = res;
          // 当所有promise都为成功转态,在all返回的promise实例中调用resolve,传入结果数组。
          
          if (promiseCount === promisesLength) {
            return resolve(results);
          }
        }, function(err) {
          return reject(err);
        });
      }
    });
  }

  static race(proms) {
    return new Promise((resolve, reject) => {
      proms.forEach((p) => {
        p.then(
          (data) => {
            resolve(data);
          },
          (err) => {
            reject(err);
          },
        );
      });
    });
  }

  static resolve(data) {
    if (data instanceof Promise) {
      return data;
    } else {
      return new Promise((resolve) => {
        resolve(data);
      });
    }
  }

  static reject(reason) {
    return new Promise((resolve, reject) => {
      reject(reason);
    });
  }
}

 

 

标签:resolve,静态方法,finally,Promise,promise,reject,return,data
来源: https://www.cnblogs.com/zhengrongbaba/p/15230569.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有