我有一个大致以下的代码(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
累加器吗?
答案 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
});
这可以被提取到这种事件发射器的一般函数中 - 但是你可以得到一般的想法。