2017-10-10 94 views
0

我知道如何使用$ .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方法,它接受一组异步调用并阻塞线程,直到他们都完成了。我承认这不可能,但我不觉得它是重复的。

+0

代码上面不会有任何效果,因为'返回数据;'总是运行Ajax调用完成之前,因此'data'不会被填充。任何你想在ajax调用完成之后发生的事情,并且依赖于它们返回的数据,_must_必须通过“done”或“then”回调来触发。你可以做什么,你的getDataFor方法是否返回由$ .when返回的Promise,以便外部代码可以附加自己的.then/.done回调。只要您愿意附上许诺,您就可以获得尽可能多的回调。 – ADyson

+0

我知道这是行不通的。我在问如何用这个例子的预期效果进行一些操作。我希望该块本质上充当一个具有async:false属性的块。在这个遗留代码的顶部初始化后有很多数组不会更改,并且它们都是当前调用同步方法的。有太多的依赖关系,因为我试图将它们中的15个链接在给定的时间线上,所以我只是试图通过将它们合并在一起来摆脱其中的一些。我可以通过将它们设置为全局变量来解决这个问题,但是.. :( – Dinerdo

+0

即使您将它们设置为全局变量,如果您在准备好之前尝试使用它们,您将遇到问题,而且无法知道如果你现在依靠同步来完成工作,那么遗憾的是一些重构是不可避免的,回复承诺可能是我能想到的最好的方法,那么至少你的调用代码已经抓住了一些东西,并且它可以添加自己的东西,然后当所有事情都完成时执行回调函数 – ADyson

回答

1

不,函数不可能多次返回,并且在ajax请求成功之前不可能返回it's not possible to return any result variables。但是,您可以简单地返回一组结果的承诺 - 但为此,您需要use then instead of done,以便您可以从回调中获得return。 (Protip:只是从来没有使用donefail)。

function getDataFor(list) { 
    return $.when(d1(list), d2(list)).then(function (v1, v2) { 
// ^^^^^^       ^^^^ 
     console.log(v1); 
     console.log(v2); 

     var data = [v1, v2]; 
     return data; 
//  ^^^^^^ 
    }); 
} 
+0

我不确定你在说什么多次返回。我只是想等几个任务完成之后再返回一次,比如.Net的WaitAll方法。我可以用一些凌乱的超时来做到这一点,但我认为这值得一试。感谢有关'然后'btw的信息! – Dinerdo

+0

@Dinerdo也许我只是误解了“*我可以多次使用它返回一个值*”部分你的问题 – Bergi

+0

啊。我只是想多次使用这个方法来返回每个调用唯一的值(基于list参数)。代表我的措辞不佳。 – Dinerdo