zoukankan      html  css  js  c++  java
  • 简单版手写promiss,包含resolve,reject,then链式调用

      // 要模拟promise的构造函数
      function MyPromise(fn) {
        this.data = null; // 要resolve的数据
        this.err = null; // 要reject的数据
        this.resolveCallback = null; // 存放resolve的回调,即  .then  里面的函数
        this.rejectCallback = null; // 存放reject的回调,即  .catch  里面的函数
        // 自定义resolve函数
        this.resolve = (data) => {
          this.data = data; // 将resolve的数据存起来
          this.then(this.resolveCallback); // resolve函数被执行了就要(再次)执行then方法
        };
        // 自定义reject函数,同上的resolve
        this.reject = (err) => {
          this.err = err;
          this.catch(this.rejectCallback)
    
        };
        /* 
          将自定义的resolve、reject函数 当参数 传到 后面的实例化构造函数中,
        */
        fn(this.resolve, this.reject)
      }
    
      /* 
        将方法定义到构造方法的prototype上,这样的好处是:
        通过该构造函数生成的实例所拥有的方法都是指向一个函数的索引,这样可以节省内存。
        当然也可不通过原型,将方法fun以函数的形式定义在构造函数之外,直接在构造函数内 this.fun = fun 也是一样的
      */
      MyPromise.prototype.then = function (callback) {
        // callback 已经赋值给了 this.resolveCallback ,说明是第二次执行此方法,是在resolve函数里执行的此方法
        this.resolveCallback && this.resolveCallback(this.data);
        // this.resolveCallback 是null,说明是第一次执行此方法,将callback 赋值给 this.resolveCallback
        this.resolveCallback || (this.resolveCallback = callback);
        // 因为存在 .then().catch() 链式调用,所以要return自己
        return this;
      }
    
      // 同上面的 MyPromise.prototype.then
      MyPromise.prototype.catch = function (callback) {
        this.rejectCallback && this.rejectCallback(this.err);
        this.rejectCallback || (this.rejectCallback = callback);
        return this;
      }
    
      // 验证一下
      let obj = new MyPromise((resolve, reject) => {
        setTimeout(() => {
          resolve("成功的数据")
        }, 1000)
        setTimeout(() => {
          reject("错误信息")
        }, 2000)
      })
      obj.then(res => {
        console.log("success:",res)
      }).catch(err => {
        console.log("fail:",err)
      })
    青云直上三千码
  • 相关阅读:
    使用python执行系统命令——subprocess
    python与数据库交互的模块pymysql
    爬虫实战_爬取豆瓣图书利用csv库存储
    正则表达式_爬取中国古诗词网与豆瓣热门图书
    双文件上传详解
    三.基础部分+asp网站搭建
    二.Google黑客语法
    主动信息收集(二)
    一.搜索引擎如何使用
    记录学习——算法时间复杂度求法
  • 原文地址:https://www.cnblogs.com/djjlovedjj/p/14715896.html
Copyright © 2011-2022 走看看