【问题标题】:proper promisification in bluebird蓝鸟的正确承诺
【发布时间】:2014-11-23 07:06:01
【问题描述】:

我有一个大致如下的代码(元 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 累加器吗?

【问题讨论】:

  • 你真的不能。 xml 似乎提供了一个流接口,它可能没有自动进行这种累积的方法。也许您可以包含指向您正在使用的特定库的链接,以便我们进行调查?
  • 这是一个xml-stream,但我不认为这个问题是针对特定实现的。
  • 对您的进度有任何反馈或更新吗?
  • 答案仍然有 results 累加器,移到外部定义中,所以我就在原地。

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


【解决方案1】:

一个promise 代表一个单个 值。这是一个值。

没有简单的方法来承诺事件发射器,因为它不提供标准合同,如单个值的节点样式回调 - 因为不同的事件被多次调用。

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

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 是你newing 的任何东西,这会让你这样做:

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

这可以被提取到这种事件发射器的通用函数中——但你明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2014-11-06
    • 2015-09-06
    • 2015-02-13
    相关资源
    最近更新 更多