我正在尝试从我的nodejs文件中读取STDIN PIPE,并向URL发出POST请求,其中每一行都由STDIN给出,然后等待响应,读取下一行,发送,等待等等
'use strict';
const http = require('http');
const rl = require('readline').createInterface(process.stdin,null);
rl.on('line', function (line) {
makeRequest(line); // I need to wait calling the next callback untill the previous finishes
}).on('close',function(){
process.exit(0);
});
问题是,rl.on('line') 将立即从我的管道中读取数千行,并立即启动数千个请求,这将导致 EMFILE 异常。我知道这是非阻塞 IO 的预期行为,但在这种情况下,不能使用 Promise/Futures,因为 .on('line') 本身就是一个回调,我无法在不丢失输入数据的情况下操纵它不触发。 那么,如果无法使用回调并且超时黑客不够优雅,如何才能摆脱 nonblockIO 的诅咒呢?
最佳答案
保留事件请求的计数器(发送时递增,响应时递减)。一旦计数器超过常量(例如 200),(检查每个“行”事件)调用 rl.pause()。对于每个响应,检查计数器是否小于常量,如果是,则调用 rl.resume()。这应该会限制内存中的请求速率和当前行,并解决您的问题。
关于javascript - nodeJS 等待无法 promise 的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000021/