多个Promise.all(),因为多个数组



我有一个对象,每个对象都有一些属性,每个对象都包含图像的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].Srcreplicate_Items[i].Src2replicate_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循环创建一个平坦的图像承诺列表。请注意,使用属性登录器通过源属性列表进行迭代。

相关内容

  • 没有找到相关文章

最新更新