我想先给你一个背景。如何在所有下载完成后触发一个功能
我有图像参数的阵列就像下面:
"imageParameters": [
{
"imageparam1": "param1",
"imageparam2": "param2",
"imageparam3": "param3"
},
{
"imageparam1": "param1",
"imageparam2": "param2",
"imageparam3": "param3"
}
]
通过此I循环来生成每个图像的唯一的网址。 然后在每次生成url时触发downloadImageAndSave函数。
imageParameters.forEach(function (image) {
var imageUrL = baseURL + "¶m1=" + image.imageparam1 + "¶m2=" + image.imageparam2 + "¶m3=" + 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();
}
我如何知道所有这些图像被下载和保存,以便我可以触发我的功能?
我遇到的问题是使用回调。我不是如何一旦下载并保存所有图像就可以获得回调。
任何帮助将不胜感激。 谢谢。
修订
下面是我想达到的工作流程。 我通过这样的快速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之前完全下载图像并压缩文件。
请相应地格式化你的代码。 – jfriend00