[英]Promise.all seems to resolve immediately
我发布了一个与Ember.RSVP.all
有关的类似问题 ,但我发现其行为与Promise.all
的行为相同。 如果我违反了任何规则,请分开提交。
我正在尝试在Promise链中使用Promise.all。 我的示例比我使用的示例简单得多,但它演示了该问题。 在承诺链的中间,我有一系列承诺,在链继续之前,所有人都需要解决-我完全理解Promise.all的目的。
不幸的是,当我返回Promise.all对象时,链中的下一个诺言将立即运行,而无需等待诺言传递给all()。
我已经设置了一个js小提琴来以我能想到的最佳方式进行演示:
请注意,First和Second几乎都几乎同时解决,这时Second应该在1s承诺再次出现之后。 第三和第四项符合预期。
小提琴代码如下所示:
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,
}
}));
}
“ 您不知道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.