最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于promise.js實現(xiàn)nodejs的promises庫

 更新時間:2014年07月06日 11:19:44   投稿:hebedich  
promise是JavaScript實現(xiàn)優(yōu)雅編程的一個非常不錯的輕量級框架。該框架可以讓你從雜亂的多重異步回調(diào)代碼中解脫出來,并把精力集中到你的業(yè)務(wù)邏輯上。

今天從GIT源碼庫中下載了promise.js,發(fā)現(xiàn)該源碼是基于Web前端JavaScript寫的,并不能直接用于nodejs。還好代碼不是很多,也不是很復(fù)雜。經(jīng)過分析整合,將其實現(xiàn)為nodejs的一個框架,代碼如下:

(function(){
/**
* Copyright 2012-2013 (c) Pierre Duquesne <stackp@online.fr>
* script: promise.js
* description: promises的nodejs模塊
* modified: https://github.com/stackp/promisejs
* authors: alwu007@sina.cn
* */

var Promise = exports.Promise = function(){
  this._callbacks = [];
};

Promise.prototype.then = function(func, context){
  //處理回調(diào)結(jié)果的方法
  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;
};
})();

另附測試代碼如下:

/**
* script: test.js
* description: promise.js測試代碼
* */

var promise = require('./mypromise');

function asyncfoo() {
  var p = new promise.Promise();
  setTimeout(function(){
    p.done();
  }, 1000);
  return p;
}

function syncfoo() {
  var p = new promise.Promise();
  p.done();
  return p;
}

var o = {};
/*
asyncfoo().then(function(){
  return 'Raymond';
}, o).then(function(err, name){
  o.name = name;
  return asyncfoo().then(asyncfoo).then(function(){
    return asyncfoo().then(asyncfoo).then(function(){
      return 18;
    });
  });
}, o).then(function(err, age){
  o.age = age;
  return asyncfoo().then(asyncfoo).then(function(){
    return asyncfoo().then(asyncfoo).then(function(){
      return 'boy';
    });
  }).then(function(err, sex){
    return sex;
  });
}).then(function(err, sex){
  o.sex = sex;
  return 'Hello, world!';
}).then(function(err, say){
  o.say = say;
  console.dir(o);
});

syncfoo().then(function(){
  return 'Raymond';
}, o).then(function(err, name){
  o.name = name;
  return syncfoo().then(syncfoo).then(function(){
    return syncfoo().then(syncfoo).then(function(){
      return 18;
    });
  });
}, o).then(function(err, age){
  o.age = age;
  return asyncfoo().then(asyncfoo).then(function(){
    return asyncfoo().then(asyncfoo).then(function(){
      return 'boy';
    });
  }).then(function(err, sex){
    return sex;
  });
}).then(function(err, sex){
  o.sex = sex;
  return 'Hello, world!';
}).then(function(err, say){
  o.say = say;
  console.dir(o);
});
*/
function asyncfoo1(){
  var p = new promise.Promise();
  setTimeout(function(){
    p.done(null, 'Raymond');
  }, 1000);
  return p;
}

function asyncfoo2(err, name){
  o.name = name;
  var p = new promise.Promise();
  setTimeout(function(){
    p.done(null, 18);
  }, 1000);
  return p;
}
function asyncfoo3(err, age){
  o.age = age;
  var p = new promise.Promise();
  setTimeout(function(){
    p.done(null, 'boy');
  }, 1000);
  return p;
}
function asyncfoo4(){
  var p = new promise.Promise();
  setTimeout(function(){
    p.done(null, 'Hello, world!');
  }, 1000);
  return p;
}
promise.Promise.chain([asyncfoo1, asyncfoo2, asyncfoo3]).then(function(err, sex){
  o.sex = sex;
  return asyncfoo4();
}).then(function(err, say){
  o.say = say;
}).then(function(){
  console.dir(o);
});

相關(guān)文章

  • Node.js+Express配置入門教程

    Node.js+Express配置入門教程

    Node.js是一個Javascript運行環(huán)境(runtime)。本文給大家介紹Node.js+Express配置入門教程,值得推薦給大家,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • node.js事件輪詢機制原理知識點

    node.js事件輪詢機制原理知識點

    在本篇文章里小編給大家分享的是一篇關(guān)于node.js事件輪詢機制的相關(guān)知識點文章,有興趣的朋友們可以參考下。
    2019-12-12
  • npm安裝慢的問題分析及解決方法

    npm安裝慢的問題分析及解決方法

    在Node.js開發(fā)過程中,npm install 是安裝和管理項目依賴的關(guān)鍵命令,然而,有時我們會遇到 npm install 運行卡住不動的情況,所以本文給大家介紹了npm安裝慢的問題分析及解決方法,需要的朋友可以參考下
    2025-03-03
  • 監(jiān)控Nodejs的性能實例代碼

    監(jiān)控Nodejs的性能實例代碼

    這篇文章主要介紹了監(jiān)控Nodejs的性能實例代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • 詳解Node.js服務(wù)器靜態(tài)資源處理

    詳解Node.js服務(wù)器靜態(tài)資源處理

    靜態(tài)資源服務(wù)器指的是不會被服務(wù)器的動態(tài)運行所改變或者生成的文件,本文主要為大家詳細(xì)介紹了Node.js服務(wù)器靜態(tài)資源處理的相關(guān)知識,需要的可以了解下
    2024-04-04
  • node解析修改nginx配置文件操作實例分析

    node解析修改nginx配置文件操作實例分析

    這篇文章主要介紹了node解析修改nginx配置文件操作,結(jié)合實例形式分析了node.js使用nginx-conf解析修改nginx配置文件的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • 詳解node中創(chuàng)建服務(wù)進程

    詳解node中創(chuàng)建服務(wù)進程

    本篇文章主要介紹了詳解node中創(chuàng)建服務(wù)進程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Windows下安裝NodeJS的詳細(xì)步驟

    Windows下安裝NodeJS的詳細(xì)步驟

    這篇文章主要介紹了Windows下安裝NodeJS,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 詳解基于Vue+Koa的pm2配置

    詳解基于Vue+Koa的pm2配置

    這篇文章主要介紹了詳解基于Vue+Koa的pm2配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Node中完整的?node?addon?實現(xiàn)流程

    Node中完整的?node?addon?實現(xiàn)流程

    這篇文章主要介紹了Node中完整的node?addon實現(xiàn)流程,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09

最新評論

阿合奇县| 尚义县| 铁力市| 宁都县| 张家口市| 丘北县| 台中县| 清丰县| 嵊州市| 道孚县| 通渭县| 靖西县| 庆安县| 贵溪市| 茶陵县| 黄平县| 宜兰县| 彭泽县| 根河市| 昌乐县| 怀仁县| 玉田县| 乌鲁木齐市| 葫芦岛市| 惠安县| 天峻县| 汉沽区| 高雄市| 南华县| 博白县| 尼木县| 固始县| 盖州市| 洛隆县| 上栗县| 威海市| 临高县| 丹棱县| 星子县| 泽普县| 新平|