2016-12-02 19 views
1

私はあなたに背景を先に伝えたいと思います。すべてのダウンロードが完了した後に関数をトリガーする方法

は私は以下のような画像パラメータの配列を有する:この貫通

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

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

Iループは画像ごとに固有の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(); 
} 

機能を起動できるように、これらの画像がすべてダウンロードされて保存されていることを確認するにはどうすればよいですか?

私が抱えている問題は、コールバックを使用することです。私はすべての画像がダウンロードされて保存されると、コールバックを得る方法はありません。

ご協力いただければ幸いです。 ありがとうございます。

以下

を更新しましたが、私が達成しようとしているワークフローです。 私はこのようにエクスプレスAPIを介してユーザーから入力を受け取ります。

イメージを含む圧縮ファイルをユーザーに返します。

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は、イメージがダウンロードされて圧縮されるまでに早すぎると呼ばれます。したがって、zipImageFiles()およびdownloadImagesToNodeServerの前に早すぎる方法でトリガされるため、image.zipファイルに問題が見つかりません。

ダウンロードが完了してからreturnTheZipFileToUser(id)がトリガーされるのを待つためにsetTimeoutを実装する方法が見つかった。しかし、画像とzipファイルのサイズによってタイミングが異なるため、これは実際の解決策ではありません。 したがって、イメージが完全にダウンロードされ、zipファイルが用意されていることを確認してからreturnTheZipFileToUserを呼び出す必要があります。

+0

コードを適切にフォーマットしてください。 – jfriend00

答えて

2

あなたはdownloadImageAndSaveからのストリームを返す場合、あなたは、あなたがフィニッシュイベントをリッスンでき、単一のストリームにストリームのすべてをCONCATするstream-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( 'finish')の下にこれらの関数を持っています。それは関数をトリガしません。あなたはこれを引き起こしているかも知っていますか? –

+0

エラーが発生した場合を除いて、すべてのストリームに対して 'finish'を呼び出す必要があります。エラーイベントを処理していますか? – pgreen2

関連する問題