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中的承諾,但文檔建議我不該不需要這樣做。
庵剛開始時,它看起來像'MyModule.prototype.myFunction'已經使用內部的承諾。你應該真的修復這個庫,並讓它返回它們而不是回調。 – Bergi
@bergi - 它使用一個返回promise的庫(request-promise),但在傳回數據之前我需要做一些額外的處理。我見過的所有文件都說你應該真的回報承諾,並使用Bluebird的promisify功能? – LiamB
如果你不得不做額外的處理,那麼在承諾'then'回調中執行並返回所產生的承諾。不要回退到常規回調。這基本上是在兩個模塊之間展開的[承諾構造反模式](http://stackoverflow.com/q/23803743/1048572),並通過使用'promisify'來模糊。 – Bergi