在蓝鸟中适当的宣传

时间:2014-09-28 23:12:51

标签: node.js coffeescript promise bluebird node-streams

我有一个大致以下的代码(meta CoffeeScript):

xml = new ...
Promise.promisifyAll xml

allRecords = []
xml.on 'frequentTag', (item) ->
   ...

   iPromise = /* some promise made from item */

   allRecords.push iPromise

xml.onAsync('end').then -> Promise.settle allRecords

现在的问题是:我可以摆脱allRecords累加器吗?

1 个答案:

答案 0 :(得分:0)

承诺代表单个值。这是一个价值。

没有简单的方法来宣传事件发射器,因为它没有为单个值提供类似节点样式回调的标准契约 - 因为不同的事件被多次调用。

Promise.promisifyAll上执行EventEmitter根本不会产生有意义的结果,您必须手动宣传它。好消息是,如果您经常这样做,您可以自己将其提取到函数中,或者使用带有promisifier参数的Bluebird' promisifyAll并让它为您进行遍历。

Bluebird不了解您的事件发射器及其在调用回调时所定义的合约以及如何调用。假设它以end事件结束,error事件数据的错误会导致frequentTag事件发生 - 我会执行以下操作:

xmlProto.prototype.getTags = function getTags(){
     // if you do this very often, this can be faster
     return new Promise(function(resolve, reject){ 
         var results = [];
         this.on("error", reject);
         this.on("frequentTag", function(item){
              iPhomise = /* some promise made from item */
              results.push(iPromise);
         });
         this.on("end", resolve.bind(null, results));
     }.bind(this)).settle(); // settle all
};

如果xmlProto是您new的任何内容,那么您可以这样做:

xml = new ...
xml.getTags().then(function(records){
    // work with records
});

这可以被提取到这种事件发射器的一般函数中 - 但是你可以得到一般的想法。