实现一个简单的Promise

Promise 学习

Promise是解决js中回调地狱的一种方式,它是一个对象,用来传递异步操作的消息,它的结果需要过一段时间才能知道(异步的意思),它会经历三种状态:pending, resolve, reject,当处于pending状态时,一段时间之后它只能走向resolve或者reject,并且结果不能反转,即:它的结果不能由resolve走向reject,同时reject也不能走向resolve.在ES6中已经内置了Promise对象,使用它的好处:

  1. 可以避免回调地狱,可以链式调用;
  2. 代码清晰;

自己实现一个简单的Promise

思路:先定义一个Promise构造函数,里面有五个变量:成功回调函数的参数值,失败回调函数的参数值,状态,存放then中成功的回调,存放then中失败的回调;两个回调方法:resolve 和 reject;以及在原型链上添加then方法;

代码实现(假如命名为:myPromise.js):

function Promise(executor) {
  let self = this;
  self.value = undefined;
  self.reason = undefined;
  self.status = 'pending';
  self.onResolvedCallbacks = []; 
  self.onRejectedCallbacks = [];
  function resolve(value) {
    if (self.status === 'pending') { // 判断状态,防止从resolve状态到reject状态
      self.value = value;
      self.status = 'resolved';
      self.onResolvedCallbacks.forEach(fn => fn());
    }
  }
  function reject(reason) {
    if (self.status === 'pending') {
      self.reason = reason;
      self.status = 'rejected';
      self.onRejectedCallbacks.forEach(fn => fn());
    }
  }
  try {
    executor(resolve, reject);
  }catch(e) {
    reject(e);
  }
}
Promise.prototype.then = function(onFulfilled, onRejected) {
  let self = this;
  if (self.status === 'resolved') {
    onFulfilled(self.value);
  }
  if (self.status === 'rejected') {
    onRejected(self.reason);
  }
  if (self.status === 'pending') {
    self.onResolvedCallbacks.push(() => {
      onFulfilled(self.value);
    });
    self.onRejectCallbacks.push(() => {
      onRejected(self.reason);
    });
  }
}
module.exports = Promise
复制代码

代码使用:

let Promise = require('./myPromise');
let promise = new Promise((resolve, reject) => {
  reject(); // 这里随意写个结果,你可以先自己定义
});
promise.then((data) => {
  console.log('success:' + data);
}, (err) => {
  console.log('error:' + err);
})
复制代码

划水结束

以上是实现promise的简单功能,我们可以根据 Promise A+规范自己去完完整整实现Promise。

转载于:https://juejin.im/post/5b5dfb9e6fb9a04f9d1c0114

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值