2017-06-19 6 views
0

現在、私のコードはすべての画像を非同期に読み込みます。これは、現在の実装では、イメージが完全にダウンロードされた後にfileArrayに追加されることを意味します。すべての画像のサイズが等しいわけではないので、各画像のダウンロードが異なる時間に終了するため、画像はランダムな順序でアレイに追加されます。ダウンロードしたファイルをアレイ内の同じ位置に置く方法

ダウンロードを開始する順番に画像をファイルアレイに追加するにはどうすればよいですか?うまくいけば非同期(すべての画像が同時にダウンロードされている)の利点を放棄しないでください。あなたはPromisesを使用してPromise.all()に非同期コールバックをマッピングすることができ

for (var i = 0; i < imageArray.length; i++) { 
      imageArray[i].download(function(err, contents) { 
       fileArray.push(base64_encode(contents)); 
       console.log("SIZE: "+fileArray.length); 
       if (fileArray.length == 9) { 
        res.render("home", {keyArray: keyArray, titleArray: titleArray, usernameArray: usernameArray, imageArray: fileArray}); 
       } 
      }); 
     } 

答えて

3

Promise.all(imageArray.map(function(image) { 
    return new Promise(function(resolve, reject) { 
     image.download(function(err, contents) { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(base64_encode(contents)); 
      } 
     }); 
    }); 
})).then(function(fileArray) { 
    res.render("home", {keyArray: keyArray, titleArray: titleArray, usernameArray: usernameArray, imageArray: fileArray}); 
}).catch(function(err) { 
    // uh oh 
}); 

ボーナスあなたが完了したことを確認するために、配列のサイズをチェックする必要はありませんです。

+0

ビンゴ。それはすごくうまくいった。私はWeb devのコーディングの問題に悩まされるたびにかなり面白いと思っています。なぜなら私は十分な約束を理解していないからです。お勧めするリンクがありますか? – TheProgrammer

+0

私の答えの2つは私が知る必要があったすべての文書を持っています。私は[async](https://github.com/caolan/async)をインストールして使用することに飽き飽きしていたので、それらを使用し始めました。これは良いライブラリですが、それに追いつくには多すぎる機能があります。約束はずっとシンプルで一貫しています。 –

+0

私はそれらがリンクであるのを見なかった^ - ^大きい! Thx – TheProgrammer

関連する問題