我知道如何使用$ .when一次执行多个ajax调用。 如:如何在一个同步块中异步执行多个ajax调用(jQuery)
$.when(d1, d2).done(function (v1, v2) {
console.log(v1); // "Fish"
console.log(v2); // "Pizza"
})
不过,我想用这一个方法,这样我可以多次使用它返回一个值(例如
function getDataFor(list) {
var data = [];
$.when(d1(list), d2(list)).done(function (v1, v2) {
console.log(v1);
console.log(v2);
data = [v1, v2];
});
return data;
}
,这是什么正确的格式也? ,是它基本上是无用的使用。然后在.done在上面的例子中,除非我计划有另一个承诺遵循一个
编辑:我不觉得这是一个重复的问题,虽然我明白这是为什么。它似乎就像那样,我真的只是想知道是否有一个开箱即用的或基于库的(如jquery/bluebird)包装器,比如.NET的WaitAll方法,它接受一组异步调用并阻塞线程,直到他们都完成了。我承认这不可能,但我不觉得它是重复的。
2017-10-10
Dinerdo
+0
代码上面不会有任何效果,因为'返回数据;'总是运行Ajax调用完成之前,因此'data'不会被填充。任何你想在ajax调用完成之后发生的事情,并且依赖于它们返回的数据,_must_必须通过“done”或“then”回调来触发。你可以做什么,你的getDataFor方法是否返回由$ .when返回的Promise,以便外部代码可以附加自己的.then/.done回调。只要您愿意附上许诺,您就可以获得尽可能多的回调。 –
+0
我知道这是行不通的。我在问如何用这个例子的预期效果进行一些操作。我希望该块本质上充当一个具有async:false属性的块。在这个遗留代码的顶部初始化后有很多数组不会更改,并且它们都是当前调用同步方法的。有太多的依赖关系,因为我试图将它们中的15个链接在给定的时间线上,所以我只是试图通过将它们合并在一起来摆脱其中的一些。我可以通过将它们设置为全局变量来解决这个问题,但是.. :( –
+0
即使您将它们设置为全局变量,如果您在准备好之前尝试使用它们,您将遇到问题,而且无法知道如果你现在依靠同步来完成工作,那么遗憾的是一些重构是不可避免的,回复承诺可能是我能想到的最好的方法,那么至少你的调用代码已经抓住了一些东西,并且它可以添加自己的东西,然后当所有事情都完成时执行回调函数 –