2016-06-27 2 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); 
    }); 

И теперь я писать вручную дополнительные блоки Promise для Src2, Src3, и так далее?

Хорошо, я мог бы получить все изображения только с 1 массивом, но мне нужно повернуть изображения в капли и сохранить их с помощью localForage.

Таким образом, только с 1 массивом, в .then(function(blobsPromise) Я не знаю, к какому пункту относится изображение.

Обход проблемы: я мог бы реплицировать структуру массива только с изображениями. Как

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

где replicate_Items[i].Src, replicate_Items[i].Src2, replicate_Items[i].Src3 в blobsPromise[i], blobsPromise[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/)? [_Создание минимального, полного и проверяемого примера_] (http://stackoverflow.com/help/mcve) – Rayon

+1

* «Я знаю, что не могу использовать для циклов» * ... да, если вы также используете закрытие. Почему этот вопрос отличается от последнего, о котором вы спрашивали об этом? без какого-либо образца данных и более подробно вопрос немного абстрактен – 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 для перебора списка свойств источника.

Смежные вопросы