繁体   English   中英

Promise.all似乎会立即解决

[英]Promise.all seems to resolve immediately

我发布了一个Ember.RSVP.all有关类似问题 ,但我发现其行为与Promise.all的行为相同。 如果我违反了任何规则,请分开提交。

我正在尝试在Promise链中使用Promise.all。 我的示例比我使用的示例简单得多,但它演示了该问题。 在承诺链的中间,我有一系列承诺,在链继续之前,所有人都需要解决-我完全理解Promise.all的目的。

不幸的是,当我返回Promise.all对象时,链中的下一个诺言将立即运行,而无需等待诺言传递给all()。

我已经设置了一个js小提琴来以我能想到的最佳方式进行演示:

请注意,First和Second几乎都几乎同时解决,这时Second应该在1s承诺再次出现之后。 第三和第四项符合预期。

http://jsfiddle.net/vqut9zy2/

小提琴代码如下所示:

function delayAjax(delay) {
    return $.ajax({
        url: '/echo/json/',
        data: {
            json: '',
            delay: delay,
        }
    });
}

delayAjax(1).then(function() {
    $('#first').addClass('red');
    var proms = [delayAjax(1), delayAjax(1)];
    return Promise.all(proms).then(function() {
        $('#onepointfive').addClass('red');
    });
}).then(function() {
    $('#second').addClass('red');
    return delayAjax(1);
}).then(function() {
    $('#third').addClass('red');
    return delayAjax(1);
}).then(function() {
    $('#fourth').addClass('red');
});

HTML

<div id="first">First</div>
<div id="onepointfive">One point five</div>
<div id="second">Second</div>
<div id="third">Third</div>
<div id="fourth">Fourth</div>

您需要先将jQuery的deferd转换为promise。

function delayAjax(delay) {
    return Promise.resolve($.ajax({
        url: '/echo/json/',
        data: {
            json: '',
            delay: delay,
        }
    }));
}

http://jsfiddle.net/evilbuck/vqut9zy2/3/

您不知道JS:异步与性能”中有一节讨论如何管理不可信任的事物: 可信的承诺?

它确实为Promise.resolve(thenable)提供了解决方法。

我还不足以解释您为什么目睹自己的行为,但是Domenic Denicola的文章“ 您错过了承诺的点”探讨了jQuery延迟不是真正的承诺的某些原因,以及它们为什么有问题。 在文章的最后,他提供了一种处理Q库中不可信任的诺言的方法,即使用Q.when() (出于相同的目的,Angularjs $q服务还提供了.when()方法):

return Q.when($.ajax({
    url: '/echo/json/',
    data: {
        json: '',
        delay: delay,
    }
}));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM