Ember.RSVP.all似乎立即解决(Ember.RSVP.all seems to resol

2019-10-21 09:39发布

我真的希望有一些愚蠢的,我做的,但我似乎无法找到它。

我想在承诺的链的中间使用Ember.RSVP.all。 我有这个例子是比我的使用更简单,但它说明了问题。 在承诺的链的中间,我有一组都需要解决之前,链可继续承诺 - 正是我明白RSVP.all成为。

不幸的是,当我返回RSVP.all对象,在链中的下一个承诺立即运行,而无需等待()传递给所有的承诺。

我已经成立了一个js小提琴以最好的方式来证明我能想到的: http://jsfiddle.net/3a9arbht/3/

请注意,第一和第二两个解决几乎一模一样的时候,当二应该是1S承诺回来后。 预期第三和第四随访。

小提琴的代码如下所示:

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

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

Answer 1:

回答基于另外一个问题的回应。 看来,虽然$.ajax反应确实是“thenable”,它是一个jQuery推迟对象,而不是承诺。 这不是我清楚他们为什么不发挥好在一起,但解决的办法很简单,就是Ajax调用转换为一个承诺:

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

随着工作小提琴: http://jsfiddle.net/evilbuck/vqut9zy2/3/



文章来源: Ember.RSVP.all seems to resolve immediately