gpt4 book ai didi

javascript - 在注册 'data' 回调之前,流会如何处理任何获取的数据?

转载 作者:行者123 更新时间:2023-12-02 16:14:40 27 4
gpt4 key购买 nike

以下示例使用curl(假设系统中存在)下载file_url指定的文件。

spawn() 返回使用传递的参数调用 curl 的结果流。 curl.stdout.on将注册一个回调,当curl将数据 block 流式传输到我们的应用程序时,我们将这些数据 block 写入文件,它是一个WriteStream

var file = fs.createWriteStream(DOWNLOAD_DIR + file_name)
var curl = spawn('curl', [file_url])

curl.stdout.on('data', function(data) {
file.write(data)
})

curl.stdout.on('end', function(data) {
file.end()
})

如果一旦调用 spawn,但在注册 on("data", [Function]) 回调之前,curl 已经获取并返回了一些数据?

当我完成这个问题时,我顿悟了内部流实现应该简单地缓冲/收集所有这些数据 block ,并且只发出'data' 如果注册了 'data' 回调,则发生事件。

你能证实这一点和/或解释我错在哪里吗?

最佳答案

简单的答案是 Node.js 是单线程的。来自curl 进程的任何消息都将被“排队”,并在Javascript 给它机会时发出。因此,由于您在此之后注册了 on('data'... 回调,因此您不会给 javascript 发出任何数据的机会。如果您使用了 setTimeout code> 然后设置 on('data'... 回调,那么是的,您可能会错过一些数据。

测试.bat

echo "Hello!"
<小时/>

无数据丢失:

var spawn = require('child_process').spawn;
var curl = spawn('test.bat');

console.log('before');
for (var i = 0; i < 2000000000; i++) {
//Waste some time
}
console.log('after');

curl.stdout.on('data', function (data) {
console.log('data: ' + data);
});

curl.stdout.on('end', function (data) {
console.log('end: ' + data);
});

setTimeout(function () { }, 10000); //Just to keep console open for 10 seconds
<小时/>

数据丢失:

var spawn = require('child_process').spawn;
var curl = spawn('test.bat');

setTimeout(function () {
curl.stdout.on('data', function (data) {
console.log('data: ' + data);
});

curl.stdout.on('end', function (data) {
console.log('end: ' + data);
});

console.log('finished');
}, 10000);

关于javascript - 在注册 'data' 回调之前,流会如何处理任何获取的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29799943/

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