【问题标题】:How to force downloaded files to stay in same position in array?如何强制下载的文件在数组中保持相同的位置?
【发布时间】:2017-11-22 03:02:23
【问题描述】:

目前,我的代码异步加载所有图像。这也意味着在我当前的实现中,图像在完全下载后被添加到 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});
                }
            });
        }

【问题讨论】:

    标签: javascript arrays loops asynchronous


    【解决方案1】:

    您可以使用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
    });
    

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

    【讨论】:

    • 宾果游戏。那效果很好。我觉得很有趣,几乎每次我在 Web 开发中遇到编码问题时,都是因为我对 Promises 理解得不够好。有推荐的链接吗?
    • 我的答案中的两个拥有我觉得我需要知道的所有文档。我只是强迫自己开始使用它们,因为我厌倦了安装和使用async。这是一个很好的库,但是有太多的功能要跟上。 Promise 更加简单和一致。
    • 我没看到那些是链接^-^ 太棒了!谢谢
    • 嗨!我再次陷入了一个非常相似的问题。你能看看吗? stackoverflow.com/questions/44654810/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多