У меня есть массив объектов, каждый объект имеет некоторые свойства, каждое свойство содержит 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();
})
Что вы думаете?
См. Http://stackoverflow.com/questions/38034574/multiple-sequential-fetch-promise/ – guest271314
Можете ли вы поделиться исполняемым демо/фрагментом или [JSFiddle] (https://jsfiddle.net/)? [_Создание минимального, полного и проверяемого примера_] (http://stackoverflow.com/help/mcve) – Rayon
* «Я знаю, что не могу использовать для циклов» * ... да, если вы также используете закрытие. Почему этот вопрос отличается от последнего, о котором вы спрашивали об этом? без какого-либо образца данных и более подробно вопрос немного абстрактен – charlietfl