2015-07-20 82 views
2

我有一個非常簡單的API,它從服務器獲取一些數據,做一些處理然後發送給客戶端。我試圖'Promisify'這個小模塊。這裏有一個例子NodeJS使用BlueBird Promisify現有的API

var MyModule = function(){} 

MyModule.prototype.makeRequest = function(requestURL){ 

    //Set request up 
    //Return the promise for the request. 
    return request(requestOptions); 
} 

MyModule.prototype.myFunction = function(var1, var2, cb){ 

    var URL = "http://....//"; 

    this.makeRequest(URL) 
     .then(function(data) 
     { 
      //Some processing logic 
      cb(null,data); 
     }) 
     .catch(function(err) 
     { 
      cb(err,null); 
     }) 
} 

module.exports = MyModule; 

然後消耗這個模塊我想執行下列操作...

var MyModule = new(require('../lib/MyModule')); 

MyModule.myFunction(var1,var2) 
      .then(function(data) 
      { 
       console.log(data); 
      }).catch(function(err){ 
       console.log(err); 
      }); 

我怎樣才能得到這個使用藍鳥工作?我一直在嘗試與PromisifyAll()像這樣..

var MyModule = new(require('../lib/MyModule')); 
var Promise = require("bluebird"); 
var MyModuleAsync = Promise.promisifyAll(MyModule); 

我對這種做法顯然是不正確,我知道我可以手動創建並返回API中的承諾,但文檔建議我不該不需要這樣做。

+1

庵剛開始時,它看起來像'MyModule.prototype.myFunction'已經使用內部的承諾。你應該真的修復這個庫,並讓它返回它們而不是回調。 – Bergi

+0

@bergi - 它使用一個返回promise的庫(request-promise),但在傳回數據之前我需要做一些額外的處理。我見過的所有文件都說你應該真的回報承諾,並使用Bluebird的promisify功能? – LiamB

+1

如果你不得不做額外的處理,那麼在承諾'then'回調中執行並返回所產生的承諾。不要回退到常規回調。這基本上是在兩個模塊之間展開的[承諾構造反模式](http://stackoverflow.com/q/23803743/1048572),並通過使用'promisify'來模糊。 – Bergi

回答

1

通過promisifying單一功能

var MyModule = new(require('../lib/MyModule')); 
var Promise = require("bluebird"); 
var MyModuleAsync = Promise.promisify(MyModule.myFunction, MyModule); 

MyModuleAsync(var1, var2).then(function(res){ 
    // etc 
}); 

一旦你得到的工作,你可以開始考慮imlementing promisifyAll()