【问题标题】:Chaining a series of ajax calls链接一系列 ajax 调用
【发布时间】:2013-06-10 13:25:22
【问题描述】:

我有一系列需要按顺序运行的 ajax 调用,但不能同步运行。最好的方法是什么?

我知道我可以$.when().then(),但这仅适用于两个 ajax 调用,不是吗?理想情况下,我想做这样的事情:

var caller;
for (var i = 0; i < argObjects.length; i++) {
    if (typeof caller === 'undefined') {
        caller = $.when($.ajax(... data: argObjects[i]...));
    }
    else {
        caller.then($.ajax(... data: argObjects[i]...));
    }
}

换句话说,只需在then 上添加一个系列,将它们链接在一起。但这是不可能的。有没有另一种方法可以用 jQuery 做到这一点?

请务必注意,这些调用不能同时运行。我可以按照设置async: false 对它们运行一个循环,但这会在处理过程中从用户手中夺走控制权,这并不好。

另一种思考方式是在一次调用中发送所有内容......但是我如何在该任务运行时监控它的进度?假设我有 10 周的数据要更新,我希望在每周完成时收到通知。如果我发送了 10 个连续的 ajax 调用,每个调用都可以返回并告诉我它已经完成,我可以更新某种进度条。这确实是这里的最终目标。

在此期间,我将继续努力解决 jQuery 中的延迟问题。

【问题讨论】:

  • 如果中间有一个请求失败,您是否要继续运行其余请求?
  • @Dogbert:不,我不想。链接success 中的调用似乎可以阻止它。
  • @slebetman - 谢谢。你的解决方案类似于 jfriend00 的,如果有点花哨!

标签: jquery ajax


【解决方案1】:

您可以使用不同的方法使用成功处理程序来启动下一个 ajax 调用,并使用计数器来跟踪您正在运行的请求:

var i = 0;
function run() {
    $.ajax(... data: argObjects[i]..., function() {
        i++;
        if (i < argObjects.length) {
            run();
        }
    });
}
run();

【讨论】:

  • 啊,该死的递归。为什么我没有想到呢?让我做点什么,看看能不能奏效。
  • @Depressio - 从技术上讲,它实际上并不是递归(尽管看起来有点像)。 run() 的第一次调用实际上在成功处理程序被调用之前完成,因此在run() 的下一次执行开始之前。
  • 是的。回调有点不同。不过,它确实看起来很相似。无论如何,我试了一下,效果很好。我想我想使用延迟链接太花哨了。 :)
【解决方案2】:

对于顺序 ajax 调用,我在第一个 ajax 的成功中调用另一个 ajax。

像这样:-

function ajax1(){
  $.ajax({
    url: "",
    data: dataString,
    type: "POST" ,
    dataType: "text",
    cache: false,   
    success: function(response_data){
        ajax2(); // call second ajax on success
    }
  });
}

function ajax2(){
  $.ajax({
    url: "",
    data: dataString,
    type: "POST" ,
    dataType: "text",
    cache: false,   
    success: function(response_data){

    }
  });
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2018-07-05
  • 2014-03-02
  • 1970-01-01
  • 2017-12-01
相关资源
最近更新 更多