美文网首页
promise实现原理

promise实现原理

作者: 9吧和9说9话 | 来源:发表于2020-02-08 15:42 被阅读0次

promise使用

参考阮一峰老师的教程

promiseA+规范

promiseA+规范

实现一个简单版本

最终版本

/**
 * Promise 
 * 1. 接受一个fn 传入参数 resolve reject
 */
;(function (win) {
  function isFunction(fn) {
    return typeof fn === 'function';
  }
  function isObject(obj) {
    return Object.prototype.toString.call(obj) === '[object Object]';
  }
  function isThenable(obj) {
    return isObject(obj) && isFunction(obj.then);
  }
  // 1. 修改state
  // 2. 触发回调
  function resolve(value, that) {
    // 添加到异步队列中 防止没有同步调用 then方法添加的回调执行不到
    // 更新_value的值 能够允许回调去修改value值
    setTimeout(function () {
      if(that.state === 'PENDING') {
        that.state = 'RESOLVED';
        that._resolves.forEach(function (callback) {
          value = callback(that._value||value);
          typeof value !== 'undefined' && (that._value = value);
        })
      }
    })
  }
  function Promise (fn) {
    var that = this;
    this.state = 'PENDING';
    this._resolves = [];
    this._rejects = [];
    this._value;

    
    // 执行传入的异步操作
    fn(function (value) {
      resolve(value, that);
    });
  }

  Promise.prototype = {
    constructor: Promise,
    // 添加回调 
    then: function (onFullFilled) {
      var prePromise = this;
      // if(this.state === 'RESOLVED') {
      //   var ret = onFullFilled(this._value);
      // } else {
      //   this._resolves.push(onFullFilled);
      // }
      // return this;
      
      // 原来的逻辑 
      // 1. then中判断当前的promise对象的状态 如果是pending 就添加到回调队列中
      // 2. 如果是resolved 那么就直接执行
      // 现在的逻辑
      // 1. 返回一个新的promise对象
      // 2. 如果之前的promise对象已经resolved 那么就执行回调
      // 3. 如果之前的promise对象还是pending 就把包装过的回调添加到回调队列中
      // 4. 包装过的回调函数会执行两个操作
        // 4.1 执行用户添加的回调函数
        // 4.2 执行当前的promise对象的resolve
      return new Promise(function (resolve) {
        function handle(value) {
          var ret = isFunction(onFullFilled) && onFullFilled(value) || value;
          // 如果是promise对象
          if(isThenable(ret)) {
            ret.then(function (value) {
              resolve(value)
            })
          } else {
            resolve(ret);
          }
          
        }
        if(prePromise.state === 'PENDING') {
          prePromise._resolves.push(handle);
        } else {
          handle(prePromise._value);
        }
      });

    },
  }
  
  
  win.Promise = Promise;
})(window)

参考:

  1. promiseA+规范
  2. 一步一步实现一个完整的、能通过所有Test case的Promise类
  3. Promise实现原理(附源码)
  4. Promise原理解析
  5. es6-promise-polyfill
  6. 手动实现一个promise

相关文章

  • javascript的promise

    实现原理 Promise.all() Promise.race()

  • 转载Promise实现原理,自己记忆备用

    Promise实现原理(原文)

  • Promise

    什么是Promise Promise解决了什么问题 Promise/A+规范 Promise的原理(如何实现链式调...

  • promise原理

    title: Promise实现原理date: 2018-02-26 17:25:09tags: promise ...

  • 手写Promise

    参考:Promise实现原理(附源码) promise的注意点: Promise特点 1.状态不可变 2.值穿透,...

  • 八(1)、Promise(周) ------ 2020-02-2

    1、什么是Promise: 2、通过原生JS实现简单的Promise原理,理解Promise如何管控异步编程: 3...

  • 实现 Promise

    实现 Promise 此代码基本源于大佬在掘金上发的文章Promise实现原理(附源码), 此文写得相当详细, 非...

  • 宏观看Promise

    自定义Promise实现,来了解他的运行原理

  • promise实现原理

    伪代码 class my_promise { constructor(fun) { const that =...

  • Promise实现原理

    当我们用$.ajax()这个API的时候,是想使用Ajax去请求数据。并且在回调函数success里面去操作我们得...

网友评论

      本文标题:promise实现原理

      本文链接:https://www.haomeiwen.com/subject/dfecbctx.html