Ember.RSVP.all似乎立即解决了

时间:2014-12-11 03:45:25

标签: javascript ember.js rsvp.js

我真的希望我做的事情有点蠢,但我似乎无法找到它。

我试图在承诺链中使用Ember.RSVP.all。我的例子比我的使用简单得多,但它证明了这个问题。在一系列承诺的中间,我有一套承诺,在链条可以继续之前都需要解决 - 正是我理解RSVP.all的目的。

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

我已经设置了一个js小提琴,以最好的方式展示我能想到的: http://jsfiddle.net/3a9arbht/3/

请注意,First和Second都在几乎完全相同的时间解决,当Second应该在1s promise之后。第三和第四按预期进行。

小提琴代码如下所示:

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');
});

1 个答案:

答案 0 :(得分:0)

基于对另一个问题的回答来回答。似乎虽然$.ajax响应确实是"但是",它是一个jQuery延迟对象,而不是Promise。我不清楚为什么他们不能很好地在一起玩,但解决方案只是将ajax调用转换为承诺:

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

有一个工作小提琴:http://jsfiddle.net/evilbuck/vqut9zy2/3/