我真的希望我做的事情有点蠢,但我似乎无法找到它。
我试图在承诺链中使用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');
});
答案 0 :(得分:0)
基于对另一个问题的回答来回答。似乎虽然$.ajax
响应确实是"但是",它是一个jQuery延迟对象,而不是Promise。我不清楚为什么他们不能很好地在一起玩,但解决方案只是将ajax调用转换为承诺:
function delayAjax(delay) {
return Promise.resolve($.ajax({
url: '/echo/json/',
data: {
json: '',
delay: delay,
}
}));
}