我试图使用一个没有实现节点约定的库,如果没有错误,则将错误值作为错误值传递,用于Bluebird的promisifyAll函数
可以在此处找到API的实现:https://github.com/sintaxi/dbox/blob/master/lib/dbox.js
我已经实现了一个自定义功能来解决这个问题,但是在使用它时我无法将第二个值打印到控制台。
function NoErrorPromisifier(originalMethod) {
// return a function
return function promisified() {
var args = [].slice.call(arguments);
// Needed so that the original method can be called with the correct receiver
var self = this;
// which returns a promise
return new Promise(function(resolve, reject) {
args.push(resolve, reject);
originalMethod.apply(self, args);
});
};
}
var client = Promise.promisifyAll(app.client(token), {
promisifier: NoErrorPromisifier
});
client.accountAsync().then(function(status, reply){
console.log(status, reply)
}).catch(function(err){
console.log(err)
})
输出:200 undefined
然而,使用传统的回调风格:
client.account(function(status, reply){
console.log(status, reply)
})
输出:200 {{ json }}
有什么想法吗?
答案 0 :(得分:1)
Promises/A+标准定义了resolve
& “onFulfilled
”用作接受单个参数,即已解析的值。同样,onFulfilled
的单一返回值会进一步传播到以下onFulfilled
函数(通过then
附加)。
client.accountAsync().then(function(status, reply){
尝试接收两个扩充,但这是不可能的,因此记录了reply
undefined
的记录。
答案 1 :(得分:1)
使用两个参数调用原始回调:status
和reply
。
你的promisifier正在用resolve
替换回调,因此也会用两个参数调用,因为它只需要一个,所以第二个参数会丢失(因此{{ 1}})。
请改为尝试:
undefined
这将导致使用包含调用回调的参数的数组调用args.push(function() { resolve([].slice.call(arguments)) });
,Bluebird具有(可选).spread()
方法:
resolve
如果使用client.accountAsync().spread(function(status, reply){
console.log(status, reply)
}).catch(function(err){
console.log(err)
})
,它将接收数组作为第一个参数。