实现Zookeeper的多重回调功能

时间:2017-02-20 04:36:21

标签: javascript promise apache-zookeeper bluebird

Zookeeper提供了一个getChildren方法,该方法接收节点的路径并在回调中返回该节点的子节点。它还会在此过程中设置一个手表,并在触发手表时调用观察者回调

getChildren(path, function(err,event){
        //this is the watcher callback
    },
    function(err,children,stats){
        //children callback
    }
)

所以如果我使用蓝鸟的Promise.promisify来宣传这个功能。我怎么知道这个函数返回的承诺是守望者还是孩子们?

1 个答案:

答案 0 :(得分:1)

如果我正确理解getChildren()接口,则最后一个回调旨在使用子对象列表调用一次。第一个回调是一个观察者回调,可以被无限次调用,以通知您发生的各种变化。

鉴于此,最后一次回调可能符合承诺。第一个回调不能也必须保持回调。此外,第二个回调是返回多个结果(这与promises不完全吻合)所以你必须使用multiArgs.spread来补贴。

所以,你可以这样做:

let getChildrenP = Promise.promisify(getChildren, {multiArgs: true});

getChildrenP(path, function(err, event) {
    // watcher event occurred here
    // this may get called multiple times
}).spread(function(children, stats) {
    // children are available now
}).catch(function(err) {
    // error here
});