自定义promise的实现

/* Promise */
function Promise() {
  this.queues = [];
  this.fails = [];
  this.progress = [];
  this.nextVal = null;
  this.nextErr = null;
}

Promise.prototype.then = function ( onFulfilled, onRejected, progress) {
  this.done.call(this, onFulfilled);
  if (Object.prototype.toString.call(onRejected) == "[object Function]") {
    this.fail.call(this, onRejected);
  }
  if (Object.prototype.toString.call(progress) == "[object Function]") {
    this.progress.call(this, progress);
  }
  return this;
};

Promise.prototype.done = function (func) {
  this.queues.push(function(data) {
    this.nextVal = func.call(null, data);
  });
  return this;

};

Promise.prototype.fail = function (func) {
  this.fails.push( function(err) {
    this.nextErr = func.call(null, err);
  });
};

/*  Deferred */
function Deferred() {
  this.status = ‘pending‘;
  this.promise = new Promise();
}

Deferred.prototype.resolve = function ( data) {
  if (this.status == ‘pending‘) {
    this.promise.queues.forEach(function(func, i) {
      func.call(this, this.nextVal || data);
    }, this.promise);

    this.status = ‘fulfilled‘;
  }
};

Deferred.prototype.reject = function(err) {
  if (this.status == ‘pending‘) {
    this.promise.fails.forEach(function(func, i) {
      func.call(this, this.nextErr || err);
    }, this.promise);
    this.status = ‘rejected‘;

  }
};

Deferred.when = function () {
  var promises = Array.prototype.slice.call(arguments, 0), results = [], start = 0, total = promises.length, defer = new Deferred();

  if (total === 0) return defer.resolve(results);
  function notifier(index) {
    return function(data) {
      start += 1;
      results[index] = data === undefined ? null : data;
      if (start == total) {
          defer.resolve(results);
      }
    }‘
  }

  for (var i = 0; i < total; i++) {
    // promise.done(function(data) { TODO }}
    promises[i].done(notifier(i));
  }

  return defer.promise;
};

Deferred.queues = function(funcs) {
  var defer = new Deferred();
  (function chain(data) {
    if (funcs.length === 0)
       defer.resolve(data);
    else
       funcs[0].call(null, data).done(function(d) {
          funcs.splice(0, 1);
          chain.call(null, d);
       });
  })();

  reurn defer.promise;
};

example

var defer = new Deferred();

defer.resolve(‘1111‘);

defer.reject(000);

defer.promise;

Deferred.when(defer.promise, defer.promise).done(function(d) { //DODO });

Deferred.queues([p1, p2, p3]).done(function(d) { //DODO });

时间: 2024-10-01 06:50:28

自定义promise的实现的相关文章

自定义Promise实现

前言 通过自定义编写promise,可以更加深刻理解Promise的用法,以及学会对别人封装的代码做定制化使用. 自定义Promise /** * 自定义Promise函数模块,IIFE */ (function(window) { const PENDING = 'pending'; const RESOLVED = 'resolved'; const REJECTED = 'rejected'; /** * Promise构造函数 * executor: 执行器函数(同步执行) */ fun

promise之nodejsQ的详细用法总结

这里主要讲node.js中Q的各种用法及说明总结,不详细介绍promise及原理. * promise是解决JS中回调层次太深 代码难懂 改起来麻烦的问题. Q是nodeJs中实现promise的包之一,是nodeJs中比较常用的一个库. 在你的项目中安装Q的方法: npm install q -save 装好后我们就可以用Q来实现nodejs的promise了! Q实现promise的常用方法有7个,在不同情况下使用不同的方法,下面就一一来介绍: ------------低-----调----

用js实现promise

/* 自定义promise 1. 执行MyPromise构造函数,要立即执行executor 2. promise实例对象,内部有三种状态 初始化 pending 成功 resolved 失败 rejected 注意:状态只能修改一次 如果executor内部出错了,promise状态改成rejected 3. then方法的实现 promise.then(onResolved, onRejected) promise的状态是resolved时,异步调用onResolved函数 promise的

ui-router学习笔记

State Manager. $stateProvider 和angular的router功能相似,但它只关心状态(state)的变化 一个最简单的state形式如下所示: <!-- in index.html --> <body ng-controller="MainCtrl"> <section ui-view></section> </body> // in app-states.js (or whatever you

Nightmare中文文档(机器翻译)

Nightmare Nightmare is a high-level browser automation library from Segment. The goal is to expose a few simple methods that mimic user actions (like goto, type and click), with an API that feels synchronous for each block of scripting, rather than d

观察者模式 -&gt; dom事件 / 自定义事件 / Promise 我的理解

观察者模式(Observer) 又称作为发布-订阅模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者对象之间通讯和耦合的问题; 观察者模式例子 引用于<JavaScript设计模式> var Observer = (function(){ var _messages = {}; // 监听信息容器 return { /** * 注册监听信息接口 * @param {String} type 监听信息类型 * @param {Function} fn 对应的回调函数 */ regist:

【转】Unity中的协同程序-使用Promise进行封装(一)

原文:http://gad.qq.com/program/translateview/7170767 译者:陈敬凤(nunu)    审校:王磊(未来的未来) 每个Unity的开发者应该都对协同程序非常的熟悉.对于很多Unity的开发者而言,协同程序就是用来编写大量异步和延时任务的一种方法.如果你不在乎速度的话,有非常非常多的特殊方法可以在任何所需的时间暂停和恢复执行.在实践中,它们可以营造一种并发函数的幻觉 (虽然他们与线程无关!).然而,协同程序会有一些问题,许多程序员在使用协同程序的时候会

自定义Angular插件 - 网站用户引导

最近由于项目进行了较大的改版,为了让用户能够适应这次新的改版,因此在系统中引入了“用户引导”功能,对于初次进入系统的用户一些简单的使用培训training.对于大多数网站来说,这是一个很常见的功能.所以在开发这个任务之前,博主尝试将其抽象化,独立于现有系统的业务逻辑,将其封装为一个通用的插件,使得代码更容易扩展和维护. 无图无真相,先上图: 关于这款trainning插件的使用很简单,它采用了类似Angular路由一样的配置,只需要简单的配置其每一步training信息. title:step的

自定义事件解决重复请求BUG

现在,组件化开发还是比较流行的,毕竟其优点相当突出.最近在开发一个组件的时候,遇到了一个很有意思的BUG... BUG的背景 最近在开发一个组件,好不容易开发好了转测试.然后,测试给我提了一个这样的bug,orz... 因为是一个组件,最大的好处就是可以随处复用,随处使用,然而,当一个页面用了多个组件,只有最后一个生效的时候,这个组件就没有什么意义了... BUG原因查找 这个组件的初始数据来源的接口是固定的,也就是说,页面内的所有这个组件在初始化的时候都会发出同样的请求,这里的请求是jsonp