我想先給你一個背景。如何在所有下載完成後觸發一個功能
我有圖像參數的陣列就像下面:
"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