首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用ajax函数,然后等待,然后再调用另一个ajax函数

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

Stack Overflow用户
提问于 2014-03-27 10:34:20
回答 3查看 1.3K关注 0票数 1

到目前为止我这么做了:

代码语言:javascript
复制
$.when(Results.ServiceController.Ajax1(clickedNumber))
.then(Results.UtilFunctions.Wait(5000))
.then(Results.ServiceController.Ajax2(clickedNumber));

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

代码语言:javascript
复制
function (time) {
    var ret = new $.Deferred();
    setTimeout(function () {
        ret.resolve();
    }, time);
    return ret;
}

问题是第二个ajax请求函数(Ajax2)不是等待函数!编辑:我也尝试过:

代码语言:javascript
复制
$.when(Results.ServiceController.Ajax1(clickedNumber),Results.UtilFunctions.Wait(5000))  
.then(Results.ServiceController.Ajax2(clickedNumber));

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-27 10:42:43

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

你应该做这样的事情:

代码语言:javascript
复制
function (f, arg, time) {
    setTimeout(function () {
        f(arg);
    }, time);
}

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

而不是。

票数 1
EN

Stack Overflow用户

发布于 2014-03-27 10:49:00

Ajax-默认情况下,函数是异步的。

解决方案1是:创建同步函数。就像jQuery一样:

代码语言:javascript
复制
$.ajax(
      url: ".../foo",
      async: false
)
$.ajax(
      url: ".../bar",
      async: false
)

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

代码语言:javascript
复制
$.ajax(
      url: "...",
      success: function (data) {
        anotherAjaxFunction()
      }
)
票数 0
EN

Stack Overflow用户

发布于 2014-03-27 11:02:14

不知道为什么不适合你。简单的演示请看这把小提琴。。

代码语言:javascript
复制
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调用,也可以是简单的追加,如我的示例中所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22684921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档