node.js - Bluebird 的适当 promise

标签 node.js coffeescript promise bluebird node-streams

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

最佳答案

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

没有简单的方法来 promise 事件发射器,因为它不提供像单个值的 Node 样式回调这样的标准契约 - 因为不同的事件被多次调用。

EventEmitter 上执行 Promise.promisifyAll 本身不会产生有意义的结果,您必须手动 Promisify。好消息是,如果您碰巧经常这样做,您可以自己将其提取到函数中,或者使用 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 是您新的的内容,这可以让您执行以下操作:

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

这可以提取到此类事件发射器的通用函数中 - 但您已经了解了总体思路。

关于node.js - Bluebird 的适当 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26090579/

相关文章:

javascript - Multer req.file.path "Cannot read property ' path' of undefined"

javascript - CoffeeScript 总是返回

javascript - Knockout 和 coffeescript - uncouched 类型错误

javascript - 将 "then"方法添加到 $promise 链中预定义的 "finally"方法之前

javascript - 如何解决 fetch 中将循环结构转换为 JSON 的问题

javascript - JavaScript(异步)如何在继续之前确定 "wait"的用途?

angularjs - Passport 身份验证成功但不重定向并给出 500 错误

node.js - Webpack 不生成 build.js

node.js - Nosql/mongoose——设计

javascript - Canvas 弧线绘制奇怪的形状 - CoffeeScript