【发布时间】:2015-07-21 00:23:34
【问题描述】:
我有一个非常简单的 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);
});
如何使用 BlueBird 实现此功能?我一直在尝试这样的 PromisifyAll()..
var MyModule = new(require('../lib/MyModule'));
var Promise = require("bluebird");
var MyModuleAsync = Promise.promisifyAll(MyModule);
我的方法显然是不正确的,我知道我可以在 API 中手动创建和返回承诺,但文档建议我不需要这样做。
【问题讨论】:
-
嗯,看起来
MyModule.prototype.myFunction已经在内部使用了 Promise。你真的应该修复那个库,让它返回它们而不是回调。 -
@bergi - 它使用一个返回承诺的库(request-promise),但在将数据传回之前我需要做一些额外的处理。我见过的所有文档都说你真的应该返回一个承诺并只使用 Bluebird 的 Promisify 功能?
-
如果您必须进行额外处理,请在 promise
then回调中执行并返回结果 promise。不要退回到常规回调。这基本上是promise construction antipattern 在两个模块之间延伸并使用promisify隐藏。 -
我明白了 - 很棒的链接!好的很酷,将看看转换它。谢谢你