【问题标题】:Is there a way to actually pause readline?有没有办法真正暂停readline?
【发布时间】:2017-01-09 21:01:38
【问题描述】:

考虑下面的代码、输入文件和结果。 setTimeout 在这里模仿外部调用,例如 http get。保持结果有序的最佳/简单方法是什么?明显增加的延迟和不并发运行是可以的。 rl.pause() 和 rl.resume() 不起作用,可能是因为它正在暂停下划线输入流,或者我在这里遗漏了什么?

'use strict';

let rl = require('readline').createInterface({
    input: require('fs').createReadStream('inputFile')
});

rl.on('line', line => {
    rl.pause();
    setTimeout(_ => {
        console.log(line);
        rl.resume();
    }, Math.random() * 2000);
});

输入文件:

1
2
3
4
5
6
7
8
9
10
11
12

结果:

10
6
1
11
3
7
8
9
12
2
5
4

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    这是 readline 模块在 NodeJS 中工作方式的限制。它会暂停读取输入,但不会立即这样做。这部分是因为 Node 流的设计目的。

    pauseresume 旨在处理背压 - 这意味着他们的目标是处理生产者“太快”以至于消费者无法跟上并平衡节点。它们从来不是在保证事情立即暂停的背景下设计的。

    您可以改用较低级别的fs 操作并逐行读取行或将它们存储在缓冲区中以克服此问题。如果文件足够小 - 只需在其上执行 fs.readFile 并按 \n 拆分就足以使用 Promise 对其进行迭代并执行异步操作。

    【讨论】:

    • 换句话说:不。谢谢。
    • @niry 差不多 - 是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2012-02-09
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多