es6中promise ALL Race Resolve Reject finish的实现

function mypromise(func){
        this.statue = "pending";
        this.data = null;
        this.resolveCallback = [];
        this.rejectCallback = [];
        this._final = null;
        var self = this;
        var resolve = function(data){
          if (data instanceof mypromise) {
            data.then(resolve,reject)
            return;
          }
          setTimeout(function(){
            if(self.statue != "pending") return;
            self.data = data;
            self.statue = "resolve";
            for(var i = 0; i < self.resolveCallback.length; i++){
              var item = self.resolveCallback[i];
              item.bind(self)(data)
            }
          },0)
        }
        var reject = function(data){
          setTimeout(function(){
            if(self.statue != "pending") return;
            self.data = data;
            self.statue = "reject";
            for(var i = 0; i < self.rejectCallback.length; i++){
              var item = self.rejectCallback[i];
              item.bind(self)(data)
            }
          },0)
        }
        try {
          if (typeof func == ‘function‘){
            func.bind(this)(resolve,reject);
          }else{
            if(func == ‘reject‘){
              this.statue = "reject";
              reject();
            }else{
              this.statue = "resolve";
              resolve();
            }
          }
        } catch (e) {
          reject(e)
        }
      }
      mypromise.prototype.then = function(onresolve,onreject){
        var self = this;
        onresolve = typeof onresolve === ‘function‘ ? onresolve : function(data){return data;}
        onreject = typeof onreject === ‘function‘ ? onreject : function(data){return data;}
        if(self.statue == "pending"){
          return new mypromise(function(resolve,reject){
            var _this = this;
            self.resolveCallback.push(function(data){
              var x = onresolve(data);
              if(x instanceof mypromise){
                x.then(resolve,reject)
              }else{
                resolve(x)
              }
              typeof _this._final == ‘function‘ ? _this._final() : null;
            })

            self.rejectCallback.push(function(data){
              var x = onreject(data);
              if(x instanceof mypromise){
                x.then(resolve,reject)
              }else{
                reject(x)
              }
              typeof _this._final == ‘function‘ ? _this._final() : null;
            })

          });
        }
        if(self.statue == "resolve"){
          return new mypromise(function(resolve,reject){
            var x = onresolve(self.data);
            if(x instanceof mypromise){
              x.then(resolve,reject)
            }else {
              resolve(x);
            }
            typeof this._final == ‘function‘ ? this._final() : null;
          });
        }
        if(self.statue == "reject"){
          return new mypromise(function(resolve,reject){
            var x = onreject(self.data);
            if(x instanceof mypromise){
              x.then(resolve,reject)
            }else {
              reject(x);
            }
            typeof this._final == ‘function‘ ? this._final() : null;
          });
        }
      }
      mypromise.prototype.catch = function(reject){
        return this.then(null,reject);
      }

      mypromise.All = function(){
        var allArguments = arguments;
        var len = allArguments.length,
            item = null,
            successResult = [],
            failResult = []
            resultData = [];
        return new mypromise(function(resolve,reject){
          function resolver(index){
            return function(data){
              successResult.push(1);
              resolveAll(index,data);
            }
          }
          function rejecter(index){
            return function(data){
              failResult.push(1);
              resolveAll(index,data);
            }
          }
          function resolveAll(index,data){
            resultData.push({index:index,data:data})
            if(successResult.length + failResult.length == len){
              if( successResult.length == len){
                resolve(resultData)
              }else{
                reject(data)
              }
            }
          }
          for(var i = 0; i < len; i++){
            item = allArguments[i];
            if(!(item instanceof mypromise)){
              throw new TypeError("you must pass promise to mypromise.all")
            }
            item.then(resolver(i),rejecter(i))
          }
        })
      }
      mypromise.Race = function(){
        var allArguments = arguments;
        var len = allArguments.length,
            item = null,
            successResult = [],
            failResult = [];
        return new mypromise(function(resolve,reject){
          function resolver(data){
            successResult.push(1);
            resolveAll(data);
          }
          function rejecter(data){
              failResult.push(1);
              reject(data);
          }
          function resolveAll(data){
            resolve(data)
          }
          for(var i = 0; i < len; i++){
            item = allArguments[i];
            if(!(item instanceof mypromise)){
              throw new TypeError("you must pass promise to mypromise.all")
            }
            item.then(resolver,rejecter)
          }
        })
      }
      mypromise.Resolve = function(func){
        if(func instanceof mypromise){
          return func;
        }else{
          return new mypromise(‘resolve‘);
        }
      }
      mypromise.Reject = function(func){
        return new mypromise(‘reject‘);
      }
      mypromise.prototype.Final = function(onresolve){
        this._final = onresolve;
      }

  

原文地址:https://www.cnblogs.com/mrzhu/p/8457058.html

时间: 2024-11-08 23:43:50

es6中promise ALL Race Resolve Reject finish的实现的相关文章

ES6中Promise对象个人理解

Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传递异步消息的那肯定就会有异步消息的状态:所以promise提供了3种状态:pending(进行中),resolved(已完成或者称 fulfilled),rejected(失败).不同的是Promise不会受外界影响,只有异步操作结果才能决定当前是哪种状态,任何其他非异步操作都不能改变.所以当状态发

阿里前端测试题--关于ES6中Promise函数的理解与应用

今天做了阿里前端的见识题目,原题目是这样的 //实现mergePromise函数,把传进去的数组顺序先后执行,//并且把返回的数据先后放到数组data中 const timeout = ms => new Promise((resolve, reject) => {setTimeout(() => {resolve();}, ms);}); const ajax1 = () => timeout(2000).then(() => {console.log('1');retur

vue ES6中promise的总结

//第一个promise已经resolve,将'foo'传入第一个then. //第一个then中的函数返回一个promise对象,该promise对象状态为pending,//根据‘如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,//并且它的终态与那个Promise的终态相同:同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的. //’摘自MDN. //直到setTimeout时

ES6中Promise学习笔记

参考资料: 廖雪峰 javascript教程-promise 阮一峰 ECMAScript 6 入门-Promise 对象 JavaScript Promise迷你书(中文版)

浅谈ES6原生Promise

浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游荡在JavaScript世界. 正所谓: 世界本没有回调,写的人多了,也就有了})})})})}). Promise的兴起,是因为异步方法调用中,往往会出现回调函数一环扣一环的情况.这种情况导致了回调金字塔问题的出现.不仅代码写起来费劲又不美观,而且问题复杂的时候,阅读代码的人也难以理解. 举例如下

ES6关于Promise的用法

Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作. 它的一般表示形式为: new Promise( /* executor */ function(resolve, reject) { if (/* success */) { // ...执行代码 resolve(); } else { /* fail */ // ...执行代码 reject(); } } );

[js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下promise的常见用法. 为什么会有promise,他的作用是什么? promise主要是为了解决js中多个异步回调难以维护和控制的问题. 什么是promise? 从图中,我们可以看出,Promise是一个函数,这个函数上有在项目中常用的静态方法:all, race, reject,resolve等,原

ES6中的Promise

Promise作为ES6中最重要的特性之一,我们有必要掌握并理解透彻.本文将由浅到深,讲解Promise的基本概念与使用方法. 1.1ES6 Promise 先拉出来遛遛 复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受.那么第一个问题来了,Promise是什么玩意呢?是一个类?对象?数组?函数? 别猜了,直接打印出来看看吧,console.dir(Promise),就这么简单粗暴. 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resol

[转]JS - Promise使用详解2(ES6中的Promise)

原文地址:https://www.hangge.com/blog/cache/detail_1638.html 2015年6月, ES2015(即 ECMAScript 6.ES6) 正式发布.其中 Promise 被列为正式规范,成为 ES6 中最重要的特性之一. 1,then()方法 简单来讲,then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数. 而 Promise 的优势就在于这个链式调用.我们可以在 then 方法中继续写 Promise 对象并