我想先给你一个背景。
我有一个图像参数数组,如下所示:
"imageParameters": [
{
"imageparam1": "param1",
"imageparam2": "param2",
"imageparam3": "param3"
},
{
"imageparam1": "param1",
"imageparam2": "param2",
"imageparam3": "param3"
}
]
我遍历此过程以为每个图像生成唯一的url。
然后在每次生成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();
}
我怎么知道所有这些图像都已下载并保存,以便可以触发功能?
我遇到的问题是使用回调。一旦下载并保存了所有图像,我就无法获取回调。
任何帮助将非常感激。
谢谢。
更新
以下是我要实现的工作流程。
我通过类似的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 + "¶m1=" + image.imageparam1 + "¶m2=" + image.imageparam2 + "¶m3=" + 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/