【问题标题】:Call ajax function, then wait, then call again another ajax function调用 ajax 函数,然后等待,然后再次调用另一个 ajax 函数
【发布时间】:2014-05-06 06:25:05
【问题描述】:

到目前为止,我是这样做的:

$.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)没有等待等待函数! 编辑: 我也试过了:

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

什么都没有改变。 来自 jQuery 文档:

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

【问题讨论】:

  • 你有没有想过让ajax请求同步?
  • 尝试为你的ajax调用制作async=falselook @ help
  • 我为什么要这样做?从 jQuery 文档看来我不必这样做。我正在返回 ajax(也就是说我正在从第一个函数 - Ajax1 函数返回承诺)只有在第二个函数 - 等待函数返回承诺之后,才应该执行第三个函数 Ajax2。

标签: javascript jquery ajax


【解决方案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
));

改为。

【讨论】:

  • 我想让我的等待功能更“通用”。无论如何,我现在会尝试这样做。
【解决方案2】:

Ajax 函数默认是异步的。

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

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

解决方案 2 是:在第一个函数调用的成功回调中执行第二个 ajax 函数调用。和 jQuery 一样:

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

【讨论】:

  • 我想将组织函数顺序的代码放在单独的函数中。我正在尝试使用 jQuery when-then。它应该工作,但它没有。
【解决方案3】:

不知道为什么它不适合你。 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 返回一个 deferred,在这个 deferred 上我只需执行一个 then 并调用另一个函数。这可以是 ajax 调用,也可以是我的示例中的简单附加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多