如何强制下载的文件保持在数组中的相同位置?

时间:2017-06-19 19:17:02

标签: javascript arrays loops asynchronous

目前,我的代码加载所有图像异步。这也意味着在我当前的实现中,一旦完全下载了图像,就将其添加到fileArray中。由于并非所有图像的大小相同,因此每个图像的下载会在不同时间完成,从而导致图像以随机顺序添加到数组中。

如何按照下载开始的顺序强制将图像添加到文件阵列?希望不会放弃异步的好处(所有图像同时下载)。

for (var i = 0; i < imageArray.length; i++) {
            imageArray[i].download(function(err, contents) {
                fileArray.push(base64_encode(contents));
                console.log("SIZE: "+fileArray.length);
                if (fileArray.length == 9) {
                    res.render("home", {keyArray: keyArray, titleArray: titleArray, usernameArray: usernameArray, imageArray: fileArray});
                }
            });
        }

1 个答案:

答案 0 :(得分:3)

您可以使用Promises并将异步回调映射到Promise.all()

Promise.all(imageArray.map(function(image) {
    return new Promise(function(resolve, reject) {
        image.download(function(err, contents) {
            if (err) {
                reject(err);
            } else {
                resolve(base64_encode(contents));
            }
        });
    });
})).then(function(fileArray) {
    res.render("home", {keyArray: keyArray, titleArray: titleArray, usernameArray: usernameArray, imageArray: fileArray});
}).catch(function(err) {
    // uh oh
});

奖金是你不需要检查数组大小来确认完成。