无法获得非节点回调库以使用Bluebird promisfy

时间:2016-01-10 20:56:59

标签: javascript node.js promise bluebird

我试图使用一个没有实现节点约定的库,如果没有错误,则将错误值作为错误值传递,用于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 }}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Promises/A+标准定义了resolve& “onFulfilled”用作接受单个参数,即已解析的值。同样,onFulfilled单一返回值会进一步传播到以下onFulfilled函数(通过then附加)。

client.accountAsync().then(function(status, reply){

尝试接收两个扩充,但这是不可能的,因此记录了reply undefined的记录。

答案 1 :(得分:1)

使用两个参数调用原始回调:statusreply

你的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) }) ,它将接收数组作为第一个参数。