2016-06-27 21 views
-1

私はオブジェクトの配列を持って、各オブジェクトはいくつかのプロパティを持って、各プロパティは、画像のURLを含んでいます。複数の配列のため複数のPromise.all()複数の配列

私はより多くの配列を持っています。これらの画像をすべてダウンロードしたいので、私はfetch()を約束します。 Promise.all()は約束事を受け入れるので、私はすべてのプロパティのすべての約束を持つ配列を持つことは望まないので、各プロパティに対してPromise.all()を実行します。

しかし、私はそれらをすべて手動で書き込む必要がありますか?私はループのために使用することはできません知っている。 または、新しい配列で内部から関数を呼び出すたびに再帰を使用する必要がありますか(この場合可能な場合)?

EDIT:ユースケース

//first I build arrays for promises 
// var results is an array of arrays that contain objects -> results[i]Items[k].property 

var items_offline_img = []; 

for (var i = results.length - 1; i >= 0; i--) { 

    for (var k = results[i].Items.length - 1; k >= 0; k--) { 
     var images = new Object(); 
     images.Src = results[i].Items[k].Src; 
     images.Src2 = results[i].Items[k].Src2; 
     images.Src3 = results[i].Items[k].Src3; 

     items_offline_img.push(images); 
    } 
} 

// Now I have to make Promise.all() for every items_offline_img[i].Src, and then for Src2 and so on. 


// Promise block 


var promises = []; 

for (var i = items_offline_img.length - 1; i >= 0; i--) { 
    promises.push(fetch(items_offline_img[i].Src)); 

} 

Promise 
    .all(promises) 
    .then(function(response) { 
     var blobs = []; 
     for (var i = response.length - 1; i >= 0; i--) { 
      var blb = response[i].blob(); 
      blobs.push(blb); 
     } 
     return Promise.all(blobs); 
    }) 
    .then(function(blobsPromise) { 
     var urlCreator = window.URL || window.webkitURL; 
     for (var i = blobsPromise.length - 1; i >= 0; i--) { 
      lcl_images[i].value = urlCreator.createObjectURL(blobsPromise[i]); 
     } 

     setItem(); 

    }) 
    .catch(function(error) { 
     console.log(error); 
    }); 

そして今、私はそうでSRC2、SRC3のための手動追加の約束のブロックを書き込み、する必要がありますか?

私は1つの配列ですべての画像を取り出すことができましたが、画像をブロブで回転させてlocalForageで保存する必要がありました。

このようにして、配列が1つのみの場合、.then(function(blobsPromise)には、画像が参照する項目がわかりません。

回避方法:イメージを含むアレイ構造のみを複製できます。同様

replicate_Items[i].Src 
replicate_Items[i].Src2 
repliacte_Items[i].Src3 

どこreplicate_Items[i].Srcreplicate_Items[i].Src2blobsPromise[i]replicate_Items[i].Src3blobsPromise[i+1]blobsPromise[i+2]

.then(function(blobsPromise) { 

    var urlCreator = window.URL || window.webkitURL; 
    var images_num = Object.keys(replicate_Items[0]).length; 
    var current_image_num = 0; 
    var k = 0; // replicate_Items[k] 
    var objectURL; 

    for (var i = blobsPromise.length - 1; i >= 0; i--) { 

     objectURL = urlCreator.createObjectURL(blobsPromise[i]); 

     if (current_image_num == 1) 
      replicate_Items[k].Src = objectURL; 
     if (current_image_num == 2) 
      replicate_Items[k].Src2 = objectURL; 
     if (current_image_num == 3) 
      replicate_Items[k].Src3 = objectURL; 

     current_image_num++; 
     if (current_image_num = images_num) { 
      current_image_num = 1; 
      k++; 
      images_num = Object.keys(replicate_Items[k]).length; 
     } 
    } 

    setItem(); 

}) 

あなたはどう思いますか?

+0

http://stackoverflow.com/questions/38034574/multiple-sequential-fetch-promise/ – guest271314

+0

実行可能なデモ/スニペットや[JSFiddle](https://jsfiddle.net/)を共有できますか? [最小限の、完全で、検証可能なexample_を作成する](http://stackoverflow.com/help/mcve) – Rayon

+1

* "forループを使用できないことを知っています" * ...はい、クロージャも使用できます。この質問はあなたがこれについて尋ねた最後のものと何か違うのはなぜですか?何らかの種類のデータサンプルや詳細がなくても、質問は少し抽象的です。 – charlietfl

答えて

0

プロパティアクセサーを使用して、Srcプロパティのリストを反復処理して、フラットプロミスリストを作成できます。

// Promise block 

var jList = ['Src','Src1','Src2']; 
var promises = []; 

for (var j=0; j < jList.length; j++) { 
    var jSrc = jList[j]; 
    for (var i = items_offline_img.length - 1; i >= 0; i--) { 
     promises.push(fetch(items_offline_img[i][jSrc])); 
    }; 
}; 

上記の例では、画像約束のフラットリストを作成するために、ネストされたforループを使用します。 property accessorを使用してソースプロパティのリストを反復処理することに注目してください。