Node.js 无冲突地处理流

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

我正在迭代获取的uri数组,我想知道如何在成功写入图像文件的同时正确控制这些流,并且只接收
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