Promise

一、Promise的来源

在前端开发中,我们时常会遇到一个省市区街道的这样一个联动的需求。当没有Promise的时候,大部分人应该都会这样写

run(0)
setTimeout(() => {
  run(1);
  setTimeOut(() => {
    run(2);
    setTimeout(() => {
     run(3);
    }, 1000)
  }, 1000)
}, 1000)

这样写就会有无限层的嵌套,所以Promise诞生了,如果使用Promise将会是这样的:

new Promise((resolve, reject) => {
  run(0);
}).then((res) => {
  run(1);
}).then((res) => {
  run(2);
}).then((res) => {
  run(3);
})

这样就很清晰,并且Promise的then会顺序执行,解决了回调地狱的问题。

二、Promise是什么

Promise:承诺,诺言

1.Promise是异步的

 2.Promise的状态:等待->成功/失败 状态不可逆转

举个例子

let isForget = true;
let getLV = new Promise((resolve, reject) => {
    if(isForget) {
      let lv = {
        color: '#fff'
      }
      resolve(lv)
    } else {
      reject('forget');
   }
})


let test = () => {
   getLV.then(fulfiled => {
     console.log(fulfiled )
   }).catch(rejected => {
     console.log(rejected )
   })
}

// 链式调用

let getKH = (lv) => {
  let msg = {
    lv,
    message: '消息'
  }
  return Promise.resolve(msg)
}

let test2 = () => {
  getLV
  .then(getKH)
  .then(res => {console.log('33', res)})
  .catch(rejected => {
     console.log(rejected )
   })
}

test2();

  三、Promise的运行顺序

const promise = new Promise((resolve, reject) => {
  console.log(1);
  resolve();
  console.log(2);
})

promise.then(() => {
  console.log(3);
})

console.log(4);

构造函数立即执行  .then异步执行

1243

再看看下面这个题

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
   console.log(1);
   resolve(2);
  }, 1000)
})

promise.then((res) => {
  console.log(res);
})

promise.then((res) => {
  console.log(res);
})

setTimeout是宏任务 会在任务队列里等待微任务执行完毕后再执行

构造函数只执行一次 。then可多次执行

122

四、手写Promise

1.定义Promise

function myPromise (excutor) {
 let self = this;
 self.value = ''; //成功的结果
 self.reason = ''; //失败的原因
 self.status = 'pending'; // 状态
 self.onFulfilledCallback = [];
 self.onRejectedCallback= [];
 function resolve(value){
  //4.状态处理
  if(self.status === 'pending) {
   self.valve = value;
   self.status = 'fullfiled'
   // 7 状态改变 将存储的方法取出
   self.onFulfilledCallback.forEach(item => item(value))
  }
 }
 function reject(reason){
 if(self.status === 'pending) {
   self.reason = reason;
   self.status = 'rejected'
   // 7 状态改变 将存储的方法取出
   self.onRejectedCallback.forEach(item => item(reason))
  }
 }


 3.添加执行器 new的瞬间执行
  try{
    excutor(resolve, reject)
  }catch(e => {
    reject(e);
  })
}

2. .then方法

myPromise.prototype.then = function(onFulfilled, onRejected) {
  // 5.处理then方法

  onFulfilled = typeOf onFulfilled === 'function' ? onFulfilled : function(data) 
  {resolve(data)}

  onRejected= typeOf onRejected=== 'function' ? onRejected: function(err) {reject(err)}

   // then函数返回的是个Promise 
let Promise = new Promise((resolve, reject) => {
  // 判断当前的状态
  switch(self.status) {
    case 'pending': 
      //6.发布订阅模式
       self.onFulfilledCallback.push(onFulfilled);
       self.onRejectedCallback.push(onRejected);
       break;
    case 'fulfilled':
      setTimeout(()=> {
       try{
        let result = onFulfilled(self.value);
        resolve(result);
       }catch(e){
        reject(e)
       }      
      }, 0);
      break;
    case 'rejected':
      setTimeout(()=> {
       try{
        let result = onRejected(self.value);
        resolve(result);
       }catch(e){
        reject(e)
       }      
      }, 0);
      break;
  }
})
return promise;
}


myPromise.prototype.catch = function(onRejected) {
 return this.then(undefined, onRejected)
}

myPromise.resolved = function(value) {
 return new myPromise((resolve, reject) => {
  if (value instanceof myPromise) {
   value.then(resolved, rejected)
 } else {
  resolve(value)
 }
})
}

myPromise.rejected = function(str) {
  return new myPromise((resolve, reject) => {
   reject(str)
  })
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值