我想先给你一个背景。

我有一个图像参数数组,如下所示:

    "imageParameters": [
      {
        "imageparam1": "param1",
        "imageparam2": "param2",
        "imageparam3": "param3"
      },

      {
        "imageparam1": "param1",
        "imageparam2": "param2",
        "imageparam3": "param3"
      }
    ]


我遍历此过程以为每个图像生成唯一的url。
然后在每次生成url时触发downloadImageAndSave函数。

imageParameters.forEach(function (image) {
var imageUrL = baseURL + "&param1=" + image.imageparam1 + "&param2=" + image.imageparam2 + "&param3=" + image.imageparam3 ;

var imageparam1 = image.imageparam1;
downloadImageAndSave(imageUrL, imageparam1);

    });

function downloadImageAndSave(imageUrL, imageparam1) {

    console.log("Download function is triggered")
    var fs = require('fs'),
        request = require('request');

    request
        .get(imageUrL)
        .on('error', function(err) {
            // handle error
        })
        .pipe(fs.createWriteStream('./imagesLocation/' + imageparam1 + '.jpeg'));

myfunctionTobeTRiggeredAfterImagesDownloadedAndSaved();
}


我怎么知道所有这些图像都已下载并保存,以便可以触发功能?

我遇到的问题是使用回调。一旦下载并保存了所有图像,我就无法获取回调。

任何帮助将非常感激。
谢谢。

更新

以下是我要实现的工作流程。
我通过类似的Express API从用户那里得到输入。

 app.get('/getStudyID', function(req, res) {
   var id = req.query['getStudyID'];
   //pass this to a variable to be used by various functions.
   downloadImagesToNodeServer(id);
   zipImageFiles();
   returnTheZipFileBackToUser(id);

   }


然后将包含图像的压缩文件返回给用户。

  function returnTheZipFileToUser(id) {

    var path = require('path');
    var mime = require('mime');
    var file = __dirname + '/public/imagelocation/' + id + '.zip';
    var filename = path.basename(file);
    var mimetype = mime.lookup(file);

    res.setHeader('Content-disposition', 'attachment; filename=' + filename);
    res.setHeader('Content-type', mimetype);

    var filestream = fs.createReadStream(file);
    filestream.pipe(res);
 }


在下载和压缩图像之前,太早调用returnTheZipFileToUser。因此,我得到了image.zip文件未找到的问题,因为它在zipImageFiles()和downloadImagesToNodeServer之前过早被触发。

我发现了一种怪异的方式来实现setTimeout,以等待下载完成,然后触发returnTheZipFileToUser(id)。但这不是真正的解决方案,因为时间根据图像和zip文件的大小而有所不同。
因此,我需要一种可以确保在调用returnTheZipFileToUser之前完全下载图像并准备好压缩文件的方式。

最佳答案

如果从downloadImageAndSave返回流,则可以使用stream-concat之类的东西将所有流合并为一个流,您可以侦听finish事件:

function downloadImages(imageParameters, cb) {

  var streams = imageParameters.map(function (image) {
    var imageUrL = baseURL + "&param1=" + image.imageparam1 + "&param2=" + image.imageparam2 + "&param3=" + image.imageparam3 ;

    var imageparam1 = image.imageparam1;
    return downloadImageAndSave(imageUrL, imageparam1);
  });

  var combinedStream = new StreamConcat(streams);
  combinedStream.on('error', function(error) {
    cb(error);
  });
  combinedStream.on('finish', function() {
    cb();
  });
}

function downloadImageAndSave(imageUrL, imageparam1) {

    console.log("Download function is triggered")
    var fs = require('fs'),
        request = require('request');

    return request
        .get(imageUrL)
        .on('error', function(err) {
            // handle error
        })
        .pipe(fs.createWriteStream('./imagesLocation/' + imageparam1 + '.jpeg'));
}

关于node.js - 所有下载完成后如何触发功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40924340/

10-16 19:47