【问题标题】:Best solution to wait for all ajax callbacks to be executed等待所有ajax回调执行的最佳解决方案
【发布时间】:2011-02-25 01:44:29
【问题描述】:

假设我们必须通过 ajax 请求源。我想在触发所有回调时执行一些操作。除了这种方法之外,如何做到这一点:

(function($){
  var sources = ['http://source1.com', 'http://source2.com'],
  guard = 0, 
  someHandler = function() { 
    if (guard != sources.length) { return; }
    //do some actions
  };

  for (var idx in sources) {
    $.getJSON(sources[idx], function(){ guard++; someHandler(); })
  }
})(jQuery)

我不喜欢这里的是,在这种情况下,我无法处理响应失败(例如,我无法为响应设置超时)和整体方法(我想应该有一种方法可以使用更多函数式编程的力量在这里)

有什么想法吗?

问候!

UPD:感谢链接回调的解决方案。我找到了一个好方法here:。这就是 cmets 中提出的:

(function hidenext(jq){
    jq.eq(0).fadeOut("fast", function(){
        (jq=jq.slice(1)).length && hidenext(jq);
    });
})($('div#bodyContent a'))

稍作调整即可等待最后一次回调。

现在我想正确处理长时间运行的请求。有什么线索吗?

【问题讨论】:

  • 这个之前有人问过,但不是 XHR,而是一系列 DOM 事件。我也记不起问题的名称了。

标签: javascript jquery ajax functional-programming callback


【解决方案1】:

javascript: execute a bunch of asynchronous method with one callback 的副本

function createCallback(limit, fn){
    var finishedCalls = 0;
    return function(){
        if (++finishedCalls == limit){
             fn();
        }
    };
}


var callback = createCallback(4, function(){
    alert("woot!");
});


async1(callback);
async2(callback);
async3(callback);
async4(callback);

【讨论】:

    【解决方案2】:

    也许您可以“级联”下载,所以第一个 getJSON 的回调会触发从下一个源下载,等等?然后在最后一个回调中,您没有剩余资源,可以调用您的“完成”函数。

    【讨论】:

    • 是的,这是个好主意!我会试试然后回来。但仍然是响应失败的问题......
    • @glaz666:为什么不能设置超时或定义处理错误的错误回调?
    • 如何设置超时? :) 错误回调是可以的
    • @glaz666:getJSON 只是 $ajax 的简写方法。使用 $.ajax() 并传递 dataType='json' 你可以在那里设置超时(详情在api.jquery.com/jQuery.ajax)。
    • 这基本上只是使调用同步,失去了异步加载的效率。
    【解决方案3】:

    您始终可以在选项中使用带有“async: false”的 $.ajax 和/或使用适当的回调(beforeSend、error、dataFilter、success 和 complete)。

    【讨论】:

    • async: false 将在发出请求时冻结浏览器 UI。
    • async:false - 可以作为一个选项,谢谢。但是在“成功”或“完成”的情况下,它将无法正常工作,因为它与 jQuery 相同
    • 我真的建议不要使用 async: false,这类请求的用户体验永远不会太好。
    【解决方案4】:

    也许我错了 - 但规则是:AJAX 的序列化 - 一次一个 所以你必须链接它 - 每个响应(回调函数)必须依次提交下一个

    *.onreadystatechange 将在准备就绪时为您提供控制(即功能) - 在这里您可以依次提交下一个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 2015-02-23
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多