调用ajax函数,然后等待,然后再次调用另一个ajax函数

时间:2014-03-27 10:34:20

标签: javascript jquery ajax

到目前为止,我做到了这一点:

$.when(Results.ServiceController.Ajax1(clickedNumber))
.then(Results.UtilFunctions.Wait(5000))
.then(Results.ServiceController.Ajax2(clickedNumber));

我的Ajax1函数返回ajax对象。我的等待功能如下所示:

function (time) {
    var ret = new $.Deferred();
    setTimeout(function () {
        ret.resolve();
    }, time);
    return ret;
}

问题是第二个ajax请求功能(Ajax2)没有等待Wait功能! 编辑: 我也尝试过:

$.when(Results.ServiceController.Ajax1(clickedNumber),Results.UtilFunctions.Wait(5000))  
.then(Results.ServiceController.Ajax2(clickedNumber));

并没有改变。 来自jQuery文档:

"在多个Deferred对象传递给jQuery.when的情况下,该方法从一个新的" master"返回Promise。延迟对象,用于跟踪已传递的所有Deferred的聚合状态。一旦所有延期解决方案解决,该方法将解决其主延期,或者在其中一个延期被拒绝后立即拒绝主延期。如果解析了主Deferred,则传递传递给jQuery的所有Deferred的已解析值。例如,当Deferreds是jQuery.ajax()请求时,参数将是请求的jqXHR对象,按照它们在参数列表中给出的顺序。"

3 个答案:

答案 0 :(得分:1)

setTimeout(...)总是立即返回,并且在超时到期后执行第一个参数传递的函数。

您应该执行以下操作:

function (f, arg, time) {
    setTimeout(function () {
        f(arg);
    }, time);
}

$.when(Results.ServiceController.Ajax1(clickedNumber))
.then(Results.UtilFunctions.Wait(
    Results.ServiceController.Ajax2, clickedNumber, 5000
));

代替。

答案 1 :(得分:0)

Ajax-Functions默认是异步的。

解决方案1是:制作同步功能。和jQuery一样:

$.ajax(
      url: ".../foo",
      async: false
)
$.ajax(
      url: ".../bar",
      async: false
)

解决方案2是:在第一个函数调用的success-callback中执行第二个ajax-function-call。和jQuery一样:

$.ajax(
      url: "...",
      success: function (data) {
        anotherAjaxFunction()
      }
)

答案 2 :(得分:0)

不确定为什么它不适合你。 See this fiddle for a simple demonstration

function wait(time) {
   var ret = new $.Deferred();
   setTimeout(function() {
       ret.resolve('resolved in ' + time);
   },time);

   return ret;
}

function ajaxCallOnWait() {
    $.each(arguments, function(index, res) {
        $('ul').append('<li>' + res + '</li>');
    });
}

var promise = $.when(wait(1000), wait(5000), wait(2000));
promise.then(ajaxCallOnWait);

它等待总共8秒,$.when返回延迟,在这个延迟时我只是做一个然后调用另一个函数。这可以是ajax调用,也可以是我样本中的简单追加。