当前位置:首页 » 《随便一记》 » 正文

手写promise,promise.all,promise.race_Mpixer的博客

26 人参与  2022年02月23日 16:32  分类 : 《随便一记》  评论

点击全文阅读


手写promise

  //手写promise
  const RESOLVE = 'resolved';//成功状态
  const REJECT = 'rejected'//失败状态
  const PENDING = 'Pending'//等待状态

  class MyPromise {
   status = PENDING;
   result = undefined
   reason = undefined
    onResolvedArr = []
    onRejectArr = []
   constructor(excution) {//promise中传入一个函数,我们定义一个excution函数
     //定义resolve与reject两个参数
     const resolve =(result) =>{//resolve中传入参数result
       if(this.status === PENDING){//promise中状态改变不可逆向,只能从PENDING转为RESOLVE或者PENDING转为REJECT
         this.result = result
         this.status = RESOLVE
         this.onResolvedArr.map((fn)=>fn())
       }
     }
     const reject =(reason) =>{//reject传入参数reason
       if (this.status === PENDING){
         this.reason = reason
         this.status = REJECT
         this.onRejectArr.map((fn)=>fn())
       }

     }
     excution(resolve,reject)//传入reslove,reject 2个参数
   }
    //传入promise的then方法
   then(onResoved,onRejected){
     if (this.status === RESOLVE){
       //利用settimeout把任务变为异步任务
       setTimeout(()=>{
         onResoved(this.result)
       },0)

     }
     if (this.status === REJECT){
       setTimeout(()=>{
         onRejected(this.reason)
       },0)
     }
     //加入promise中传入一个异步的函数,通过发布订阅模式来实现监听
     if(this.status === PENDING){
       this.onResolvedArr.push(() => {
         onResoved(this.result)
       })
       this.onRejectArr.push(() => {
         onRejected(this.reason)
       })
     }
   }
  }
//应用
  const  test = new MyPromise((resolve,reject)=>{
    setTimeout(()=>{
      resolve('hello world')
    },1000)
  })
  test.then((res) => {
    console.log(res)
  })
  console.log(1111)

手写promise.all

  Promise.all = function (iterator) {//promise.all传入的为一个迭代器
    const promises = Array.from(iterator)//将迭代器转化成数组
    let count = 0
    let res = []//储存结果
    return new Promise((resolve,reject)=>{//promise.all返回一个promise对象
      for (let i in promises){//对传入的数据进行遍历
        Promise.resolve(promises[i])//将传入的数据每个都转化成promise对象
        .then((data)=>{
          res[i] = data//调用成功存入res中
          if (++count === promises.length){//每次调用成功累加count,当count等于promises的长度,就表明每次都调用成功
            resolve(res)//则返回resolve
          }
        })
        .catch((e)=>{//当count不等于promises的长度则表示其中有失败的调用,则放回reject
          reject(e)
        })
      }
    })
  }

手写promise.race(与all同理,不需要判断)

     Promise.race = function (iterator) {
    const promises = Array.from(iterator)
    return new Promise((resolve,reject) => {
      for (let i in promises) {
        Promise.resolve(promises[i])
            .then((res) => {
              resolve(res)
            })
            .catch(e => {
              reject(e)
            })
      }

    })
  }


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/35268.html

传入  手写  调用  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 重生后我转嫁首富瘸腿独子,总裁前夫却疯了一口气看完_妹妹傅云琛沈明辉独家番外_小说后续在线阅读_无删减免费完结_
  • 我拒绝给系花捐款后,全系同学悔疯了在线阅读_小说后续在线阅读_无删减免费完结_
  • 我让位给女友的透视眼竹马,他却说如果能重生再也不来了。虐心反转_玉石林若女友推荐_小说后续在线阅读_无删减免费完结_
  • 相国独子的丫鬟砸坏我的玉佩后,我当场拒婚阅读_玉佩陈郡谢氏全新_小说后续在线阅读_无删减免费完结_
  • 手术时,我看着病人惨死最新试读_淼淼陆知衍姜颜全本完结_小说后续在线阅读_无删减免费完结_
  • 男友霸道给我开黑卡,转头却骂我是捞女最新章节_肖年顾客黑卡热文_小说后续在线阅读_无删减免费完结_
  • 他在回忆尽头全集_贺南舟许清梨叶絮完结txt_小说后续在线阅读_无删减免费完结_
  • 旅游结婚那天未婚夫另娶女秘书,我让他们一无所有连载_老公迎宾超长版_小说后续在线阅读_无删减免费完结_
  • 完结文异界修仙我的直播间能打赏核弹列表_完结文异界修仙我的直播间能打赏核弹(江流年沈红菱)
  • 全书浏览陪弟弟混骑行圈,离婚你哭什么?(韩星河柳千雪)_陪弟弟混骑行圈,离婚你哭什么?(韩星河柳千雪)全书结局
  • 老公出轨我助攻虐心反转_秦绍卿卿阿溪后续加长_小说后续在线阅读_无删减免费完结_
  • 替老婆坐牢出狱那天,我被送去斗兽场精校文本_许言沈宇郑子番茄热门_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1