在两个单独的Ajax调用完成时调用函数的好方法是什么?

时间:2014-07-31 17:50:02

标签: javascript jquery ajax

所以我有一些类似于以下简化版本的JS:

var MyAjax = $.ajax({
    url: 'api/myApi',
    type: "POST",
    data: myData,
    dataType: "json",
    success: function (data) {
        if (condition) {
            var weightCounts = $.ajax({
                url: 'api/myApi',
                type: "POST",
                data: myConditionalData,
                dataType: "json",
                success: function (conditionalData) {
                    MyExternalMethod(data, conditionalData)
    }
});

基本上我有两个Ajax调用。我有一个检索一些数据,第二个检索一些数据,如果启用了其他设置。条件调用嵌套在主调用成功事件中的原因是因为MyExternalMethod()的args是由这些调用生成的,因此它们都需要完成。

从概念上讲,这些调用完全是彼此独立的,并且条件调用不需要等待初始调用的成功事件,这只是编写此代码时我能想到的最佳方法。 。我想重构这个来修复等待执行条件的第一个请求的缓慢,但我不确定最好的方法。

到目前为止,我最好的想法是:

var firstData = null;
var secondData = null;

var MyFirstAjax = $.ajax({
    url: 'api/myApi',
    type: "POST",
    data: myData,
    dataType: "json",
    success: function (data) {
        firstData = data;
        if (secondData){
            MyExternalMethod(firstData, secondData)
        }

});

var MySecondAjax = $.ajax({
    url: 'api/myApi',
    type: "POST",
    data: myData,
    dataType: "json",
    success: function (data) {
        secondData = data;
        if (firstData){
            MyExternalMethod(firstData, secondData)
        }
});

除了使用这些变量作为标志之外,还有其他标准方法吗?就JS工作而言,我习惯于在裤子的座位上飞行,但我正在尝试编写更清晰,更标准的代码,所以我想知道是否有比上述更有利的方法(或者以上是否有任何我没有看到的主要缺点。

由于

2 个答案:

答案 0 :(得分:4)

您可以使用$.when() ...

var MyFirstAjax = $.ajax({
    url: 'api/myApi',
    type: "POST",
    data: myData,
    dataType: "json"
});

var MySecondAjax = $.ajax({
    url: 'api/myApi',
    type: "POST",
    data: myData,
    dataType: "json"
});

$.when(MyFirstAjax, MySecondAjax).then(function (firstResult, secondResult) {
    var firstData = firstResult[0];
    var secondData = secondResult[0];
    MyExternalMethod(firstData, secondData)
});

答案 1 :(得分:0)

简短回答:像async.js这样的图书馆会有所帮助。

答案很长:有几种方法可以解决这个问题。

基本上两个ajax都需要在function check_ajax()上触发相同的回调说success:,这会检查firstDatafirstData是否可用。如果是,请致电MyExternalMethod

一个很好的参考:http://book.mixu.net/node/ch7.html