2016-12-02 84 views
1

我想先給你一個背景。如何在所有下載完成後觸發一個功能

我有圖像參數的陣列就像下面:

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

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

通過此I循環來生成每個圖像的唯一的網址。 然後在每次生成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(); 
} 

我如何知道所有這些圖像被下載和保存,以便我可以觸發我的功能?

我遇到的問題是使用回調。我不是如何一旦下載並保存所有圖像就可以獲得回調。

任何幫助將不勝感激。 謝謝。

修訂

下面是我想達到的工作流程。 我通過這樣的快速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之前完全下載圖像並壓縮文件。

+0

請相應地格式化你的代碼。 – jfriend00

回答

2

如果從downloadImageAndSave返回流,然後你可以使用類似stream-concat所有流的Concat的到一個單一的數據流,你可以聽,對於終點事件:

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')); 
} 
+0

謝謝你。 我不確定這個 –

+0

中的回調函數是在哪裏定義的,嗨pgreen2,我仍然在爲這個而苦苦掙扎。 我有2個功能,我需要下載圖像後觸發。 1-將圖像壓縮到文件夾 2-將zip文件複製到其他位置。 我有combined.stream.on('完成')下的這些功能。它只是不觸發功能。你知道這可能是什麼原因嗎?除非發生錯誤,否則應調用任何流的'完成' –

+0

。你在處理錯誤事件嗎? – pgreen2

相關問題