使用承诺顺序加载

戴夫

我有一系列异步调用,希望依次调用它们,这意味着在第一个诺言完成之前,我不希望调用第二个诺言。

在以下示例中,我得到了一个循环,该循环可动态创建唯一的图像并将其附加到页面上。我希望按顺序附加图像,但是由于某些原因,它们并不总是按照创建时的确切顺序进行渲染:

var container = document.getElementById("container");
var promise = Promise.resolve();
for(var i = 0; i<100; i++) {
    (function(i) {
        promise = promise.then(function() {
            createPromise(container, i);
        });
    })(i);
}

function createPromise(container, i) {
    return new Promise(function(resolve,  reject) {
        var img = new Image();
        img.onload = function() {
            container.appendChild(img);
            resolve();
        };
        img.onerror = function() {
            reject();
        };
        img.src = "http://placehold.it/100x100?text=Image+" + i + "&v=" + Date.now();
    });
}
img { float: left; margin: 5px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.27/bluebird.min.js"></script>
<div id="container"></div>

我还创建了一个说明问题小提琴

我使用的是bluebird,但我更愿意坚持使用本机ES6实施。

美度

如果我是正确的,则此块导致了该问题:

    promise = promise.then(function() {
        createPromise(container, i);
    });

createPromise返回一个Promise,但是在内部then您没有返回该Promise,因此它将假定return undefined;(所有js函数的默认值),因此,任何后续Promise都不会等待前任完成后再开始。尝试将其更改为:

    promise = promise.then(function() {
        return createPromise(container, i);
    });

var container = document.getElementById("container");
var promise = Promise.resolve();
for(var i = 0; i<100; i++) {
    (function(i) {
        promise = promise.then(function() {
            return createPromise(container, i);
        });
    })(i);
}

function createPromise(container, i) {
    return new Promise(function(resolve,  reject) {
        var img = new Image();
        img.onload = function() {
            container.appendChild(img);
            resolve();
        };
        img.onerror = function() {
            reject();
        };
        img.src = "http://placehold.it/100x100?text=Image+" + i + "&v=" + Date.now();
    });
}
img { float: left; margin: 5px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.27/bluebird.min.js"></script>
<div id="container"></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用承诺顺序加载

来自分类Dev

如何使用 $q 顺序调用承诺

来自分类Dev

使用嵌套Q承诺进行顺序/相关操作

来自分类Dev

在 vanilla Javascript 中使用 async/await 的顺序承诺

来自分类Dev

承诺未按顺序运行

来自分类Dev

多个顺序的fetch()承诺

来自分类Dev

角度承诺顺序循环

来自分类Dev

承诺后的操作顺序

来自分类Dev

承诺顺序错误

来自分类Dev

承诺顺序错误

来自分类Dev

按顺序执行承诺

来自分类Dev

猫鼬顺序承诺

来自分类Dev

如何使用Composer设置文件加载顺序?

来自分类Dev

如何使用Composer设置文件加载顺序?

来自分类Dev

使用承诺状态恢复的React Redux动态模块加载模块

来自分类Dev

Ava 使用承诺测试图像加载:测试返回的承诺从未解决

来自分类Dev

JavaScript承诺反向加载

来自分类Dev

承诺未按预期顺序运行

来自分类Dev

嵌套承诺实现顺序执行

来自分类Dev

Nodejs / Q:链式顺序承诺

来自分类Dev

异步/顺序承诺,检测结束

来自分类Dev

控制余烬承诺解决的顺序?

来自分类Dev

以“错误”顺序执行的嵌套承诺

来自分类Dev

JS - 承诺以错误的顺序执行

来自分类Dev

使用承诺

来自分类Dev

如何使用Meteor.startup解决文件加载顺序问题?

来自分类Dev

使用webcomponenetsjs的HTMLImports以意外的执行顺序加载导入-FireFox

来自分类Dev

如何使用HTML / javascript以预定义的顺序加载图像?

来自分类Dev

使用.load()顺序加载一系列HTML文档