gpt4 book ai didi

javascript - 有什么方法可以将 Node 流作为可迭代对象使用吗?

转载 作者:行者123 更新时间:2023-12-02 19:55:27 26 4
gpt4 key购买 nike

我正在编写一个工具,它处理传递到 stdin 的一堆文本,每一行都是一个“条目”。我想让我的代码更加实用,因此我想将这组行视为“序列”或“可迭代”,并使用 reduce 对其进行迭代。

我目前正在使用 Node模块LineStreamstdin 作为一组行进行处理,但它的工作原理是为每行分派(dispatch)一个 data 事件 - 这很好,它正在实现 Readable Stream界面。

所以我目前正在做一种非常“手动”的减少,每次 data 事件触发时将临时值传递给我的函数:

var windows = [];

linestream.on('data', function(line) {
return windows = rollup(windows, extractDate(line), argv.w);
});

linestream.on('end', function() {
return process.stdout.write(toCsv(windows));
});

process.stdin.resume();

但是这样做会更实用:

linestream.lines.reduce(rollup, []);

function rollup(windows, line) {
// would return a new interim or final value
}

当然,我可以将所有行“收集”到一个常规数组中,然后减少它,但我尝试过这样做,当我在大型数据集上运行我的工具时,它使用了太多内存 - 所以像迭代之类的东西通过流确实是必要的。

我想我要问的是是否可以编写一个 Node 函数/模块来执行此操作,或者是否已经存在。

谢谢!

最佳答案

我不认为有任何方法可以使其更加实用,因为您正在处理异步性。

要使 linestream.lines 存在,我认为需要发生以下两件事之一:

  • 每行的内存缓冲区,您已经说过占用太多内存
  • 一种新的语言结构,允许异步控制流看起来像同步控制流。

我想你可以这样做(假设使用jquery或其他一些promise api):

var op = (function(){

var windows = []
,done = $.deferred();

linestream.on('data', function(line) {
return windows = rollup(windows, extractDate(line), argv.w);
});

linestream.on('end', function() {
process.stdout.write(toCsv(windows));
return done.resolve(windows);
});

process.stdin.resume();

return done.promise();

})();

但实际上这只是隐藏东西。

或者,您可以使用类似 Rx 的内容,或者等到generators就在附近。

关于javascript - 有什么方法可以将 Node 流作为可迭代对象使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com