Node.js 无冲突地处理流
我正在迭代获取的uri数组,我想知道如何在成功写入图像文件的同时正确控制这些流,并且只接收Node.js 无冲突地处理流,node.js,Node.js,我正在迭代获取的uri数组,我想知道如何在成功写入图像文件的同时正确控制这些流,并且只接收max中指定的图像量?不知何故,这仍然忽略了计数 大纲 写下图像 输出下载图像的计数 如果达到最大计数,则退出 编辑: var count = 1; var max = 1000; images.each(function (index, element) { var uri = element.attribs.src; request(uri).pipe(fs.createWriteStream
max
中指定的图像量?不知何故,这仍然忽略了计数
大纲
var count = 1;
var max = 1000;
images.each(function (index, element) {
var uri = element.attribs.src;
request(uri).pipe(fs.createWriteStream(output(uri)))
.on('data', function () {
console.log('[' + chalk.green('+') + ']' + ' wrote image ' + count);
sleep.sleep(1); // pause between requests
});
.on('end', function () {
count++;
if (count === max) {
process.exit(0);
}
});
.on('error', function () {
console.log('[' + chalk.red('x') + ']' + ' failed to write image');
});
});
这里有一个可能的解决方案:
var left = 1000,
imagesChunk = images.slice(0, left);
function onDone() {
// we're done!
}
left = imagesChunk.length;
imagesChunk.each(function (index, element) {
var uri = element.attribs.src;
var stream = request(uri);
var writeStream = fs.createWriteStream(output(uri));
var hadError = false;
stream.on('error', function(err) {
if (hadError)
return;
console.log('[' + chalk.red('✗') + ']');
writeStream.close();
hadError = true;
})
.pipe(writeStream)
.on('error', function(err) {
if (hadError)
return;
console.log('[' + chalk.red('✗') + ']');
stream.destroy();
hadError = true;
})
.on('close', function() {
if (!hadError)
console.log('[' + chalk.green('✓') + ']');
if (--left === 0)
onDone();
});
});
你的意思是你想处理
图像中的所有项目,但希望最大并发性(在任何给定时间处理的最大项目数)为1000?以下是我试图做的:我正在下载图像,但我只想要最大数量的图像。同时,我想确保图像已正确下载@mscdex希望这是有意义的。我已经做了一个编辑,它应该能勾勒出更多我想要的东西@mscdexI假设onDone是我可以在每次图像请求之间暂停的地方。类似于(Math.random()*(3-1)+1)|0代码>对吗@mscdexIt不会是“暂停”,因为.each()
一次迭代整个数组。onDone()
就是所谓的已处理的所有图像。你是说在任何给定的时间只需要一个未完成的请求吗?我想在写入每个图像时打印它,console.log图像计数,然后在每个请求之间暂停。这样我就不会炸毁他们的服务器,这看起来很自然。例如:[+]编写了图像1。。。写入图像2…
直到达到最大值@mscdex