我正在 node.js 中编写一个实用程序,它必须每晚处理和连接大量文件。在同步伪代码中,它看起来像这样(为了清楚起见,省略了 try / catch):
while (true) {
var next = db.popNext();
if (!next) return;
out.append(next);
}
但是,在我使用的库中,popNext()
实际上是一个节点样式的异步方法,看起来像这样:popNext(callback)
.
由于我是从头开始编写中间件,因此我可以使用--harmony
(例如generators)、async或bluebird。
理想情况下,我更喜欢类似的东西:
forEachOrdered(db.popNext, (error, next, ok, fail) => {
if(error) return; // skip
// If there was an internal error, terminate the whole loop.
if(out.append(next)) ok();
else fail();
}).then(() => {
// All went fine.
}).catch(e => {
// Fail was called.
});
但是,我对其他“标准”解决方案持开放态度。我想知道这个问题最简洁的解决方案是什么?
编辑同时产生所有(在常规for循环中)可能无法解决我的问题,因为我们谈论的是100k,并且对于我必须打开和读取文件的每个项目,所以我可能会用完文件描述符.