我有一个对象,每个对象都有一些属性,每个对象都包含图像的URL。
我有更多的数组,我想下载所有这些图像,因此我使用fetch()
Promise。 Promise.all()
接受一系列承诺,因此我为每个属性运行Promise.all()
,因为我不想拥有所有属性的所有承诺的数组。
但是..我必须手动写所有它们吗?我知道我不能用于循环。还是我必须使用递归(如果在这种情况下可以使用递归),每次用新数组从内部调用功能?
编辑:用例
//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].Src
, replicate_Items[i].Src2
, replicate_Items[i].Src3
in 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();
})
您怎么看?
可以使用属性登录器通过Src
属性列表创建平坦的Promise列表。
// 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
循环创建一个平坦的图像承诺列表。请注意,使用属性登录器通过源属性列表进行迭代。