zoukankan      html  css  js  c++  java
  • Promise(interesting)

    // 最主要的是理解setTimeout和(浏览器执行程序 || resolve执行位置)的顺序就能吃透了

    //(MD 楞是看了我2个小时时间 真的是费脑洞︿( ̄︶ ̄)︿)X.then.then

    以下:我把完整版摘出来
    try {
        module.exports = Promise
      } catch (e) {}
      
      function Promise(executor) {
        var self = this
      
        self.status = 'pending'
        self.onResolvedCallback = []
        self.onRejectedCallback = []
      
        function resolve(value) {
          if (value instanceof Promise) {
            return value.then(resolve, reject)
          }
          setTimeout(function() { // 异步执行所有的回调函数
            if (self.status === 'pending') {
              self.status = 'resolved'
              self.data = value
              for (var i = 0; i < self.onResolvedCallback.length; i++) {
                self.onResolvedCallback[i](value)
              }
            }
          })
        }
      
        function reject(reason) {
          setTimeout(function() { // 异步执行所有的回调函数
            if (self.status === 'pending') {
              self.status = 'rejected'
              self.data = reason
              for (var i = 0; i < self.onRejectedCallback.length; i++) {
                self.onRejectedCallback[i](reason)
              }
            }
          })
        }
      
        try {
          executor(resolve, reject)
        } catch (reason) {
          reject(reason)
        }
      }
      
      function resolvePromise(promise2, x, resolve, reject) {
        var then
        var thenCalledOrThrow = false
      
        if (promise2 === x) {
          return reject(new TypeError('Chaining cycle detected for promise!'))
        }
      
        if (x instanceof Promise) {
          if (x.status === 'pending') { //because x could resolved by a Promise Object
            x.then(function(v) {
              resolvePromise(promise2, v, resolve, reject)
            }, reject)
          } else { //but if it is resolved, it will never resolved by a Promise Object but a static value;
            x.then(resolve, reject)
          }
          return
        }
      
        if ((x !== null) && ((typeof x === 'object') || (typeof x === 'function'))) {
          try {
            then = x.then //because x.then could be a getter
            if (typeof then === 'function') {
              then.call(x, function rs(y) {
                if (thenCalledOrThrow) return
                thenCalledOrThrow = true
                return resolvePromise(promise2, y, resolve, reject)
              }, function rj(r) {
                if (thenCalledOrThrow) return
                thenCalledOrThrow = true
                return reject(r)
              })
            } else {
              resolve(x)
            }
          } catch (e) {
            if (thenCalledOrThrow) return
            thenCalledOrThrow = true
            return reject(e)
          }
        } else {
          resolve(x)
        }
      }
      
      Promise.prototype.then = function(onResolved, onRejected) {
        var self = this
        var promise2
        onResolved = typeof onResolved === 'function' ? onResolved : function(v) {
          return v
        }
        onRejected = typeof onRejected === 'function' ? onRejected : function(r) {
          throw r
        }
      
        if (self.status === 'resolved') {
          return promise2 = new Promise(function(resolve, reject) {
            setTimeout(function() { // 异步执行onResolved
              try {
                var x = onResolved(self.data)
                resolvePromise(promise2, x, resolve, reject)
              } catch (reason) {
                reject(reason)
              }
            })
          })
        }
      
        if (self.status === 'rejected') {
          return promise2 = new Promise(function(resolve, reject) {
            setTimeout(function() { // 异步执行onRejected
              try {
                var x = onRejected(self.data)
                resolvePromise(promise2, x, resolve, reject)
              } catch (reason) {
                reject(reason)
              }
            })
          })
        }
      
        if (self.status === 'pending') {
          // 这里之所以没有异步执行,是因为这些函数必然会被resolve或reject调用,而resolve或reject函数里的内容已是异步执行,构造函数里的定义
          return promise2 = new Promise(function(resolve, reject) {
            self.onResolvedCallback.push(function(value) {
              try {
                var x = onResolved(value)
                resolvePromise(promise2, x, resolve, reject)
              } catch (r) {
                reject(r)
              }
            })
      
            self.onRejectedCallback.push(function(reason) {
                try {
                  var x = onRejected(reason)
                  resolvePromise(promise2, x, resolve, reject)
                } catch (r) {
                  reject(r)
                }
              })
          })
        }
      }
      
      Promise.prototype.catch = function(onRejected) {
        return this.then(null, onRejected)
      }
      
      Promise.deferred = Promise.defer = function() {
        var dfd = {}
        dfd.promise = new Promise(function(resolve, reject) {
          dfd.resolve = resolve
          dfd.reject = reject
        })
        return dfd
      }
    
    
      var a = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1)
        }, 500)
        console.log(13123)
      })
    
      a.then((params) => {
          console.log(params)
          return 2
      }).then((dd) => {
        console.log(dd)
      })
    
      a.then((dd) => {
        console.log(dd)
        return new Promise(function (resolve) {
            setTimeout(() => {
                resolve('dengdai')
            }, 1000)
        })
      }).then(c => {
          console.log(c)
      }) 
    
      a.then((dd) => {
        console.log(dd)
      })
    
  • 相关阅读:
    影响历史进程的三只苹果
    C语言实现的RSA算法程序(使用GMP)
    C++实现的大整数分解Pollard's rho算法程序
    Java实现的大整数分解Pollard's rho算法程序
    素性测试算法
    素性测试AKS算法程序
    C++实现的Miller-Rabin素性测试程序
    为什么天朝互联网的三巨头是BAT
    KMP模式匹配算法程序(Python,C++,C)
    I00014 汉若塔问题的C++程序
  • 原文地址:https://www.cnblogs.com/kitebear/p/10275069.html
Copyright © 2011-2022 走看看