promise.js實現nodejs的promises庫

antzone發表於2017-03-26

本章節分享一段程式碼,是由promise.js實現的nodejs的promises庫,希望能夠給需要的朋友帶來幫助。

promise是由javascript實現的輕量級的框架,此框架可以讓程式設計人員從紛亂複雜的非同步回撥中抽出精力來,集中於業務邏輯方面的工作。但是在預設狀態下,promise.js並不能夠直接用於node.js,下面就是將其進行封裝整合一下,將其實現為node.js下的一個框架。

程式碼如下:

[JavaScript] 純文字檢視 複製程式碼
(function(){
var Promise = exports.Promise = function(){
  this._callbacks = [];
};
 
Promise.prototype.then = function(func, context){
  //處理回撥結果的方法
  function doCallbackResults(r) {
    if (r instanceof Promise) {
      r.then(function(err, values){
        p.done(err, values);
      });
    } else {
      p.done(null, r);
    }
  }
 
  var p = new Promise();
  if (this._isdone) {
    var results = func.apply(context, this.results);
    doCallbackResults(results);
  } else {
    this._callbacks.push(function(){
      var results = func.apply(context, arguments);
      doCallbackResults(results);
    });
  }
  return p;
};
 
Promise.prototype.done = function(){
  this.results = arguments;
  this._isdone = true;
  for (var i=0; i<this._callbacks.length; i++) {
    this._callbacks[i].apply(null, arguments);
  }
  this._callbacks = [];
};
 
Promise.join = function(promises){
  var p = new Promise();
  var results = [];
 
  if (!promises || !promises.length) {
    p.done(results);
    return p;
  }
 
  var numdone = 0;
  var total = promises.length;
 
  function notifier(i) {
    return function() {
      numdone += 1;
      results[i] = Array.prototype.slice.call(arguments);
      if (numdone === total) {
        p.done(results);
      }
    };
  }
 
  for (var i = 0; i < total; i++) {
    promises[i].then(notifier(i));
  }
 
  return p;
};
 
Promise.chain = function(funcs, args) {
  var p = new Promise();
  if (!funcs || !funcs.length) {
    p.done.apply(p, args);
  } else {
    funcs[0].apply(null, args).then(function(){
      funcs.splice(0, 1);
      Promise.chain(funcs, arguments).then(function(){
        p.done.apply(p, arguments);
      });
    });
  }
  return p;
};
})();

相關文章