如何控制在jQuery$(document).ready中调用函数的顺序

如何控制在jQuery$(document).ready中调用函数的顺序,jquery,Jquery,我需要能够控制$(document.ready事件中正在处理的项目的顺序。 这些是从多个文件加载的多个控件,所有控件都要求在ready事件中调用。它们都启动对服务器的异步调用(AJAX)。只有在他们都做完之后,我才需要做一些额外的工作 对于这个问题,什么是优雅的解决方案?根据页面的其他部分,在处理程序中执行“额外工作”可能是一个更优雅的选项 但是,如果用户能够和/或可能在初始调用进行过程中触发后续的$.ajax()调用,则不合适。在这种情况下,他们手动触发的调用可能会将$.ajaxStop事件延

我需要能够控制
$(document.ready
事件中正在处理的项目的顺序。
这些是从多个文件加载的多个控件,所有控件都要求在
ready
事件中调用。它们都启动对服务器的异步调用(AJAX)。只有在他们都做完之后,我才需要做一些额外的工作


对于这个问题,什么是优雅的解决方案?

根据页面的其他部分,在处理程序中执行“额外工作”可能是一个更优雅的选项


但是,如果用户能够和/或可能在初始调用进行过程中触发后续的$.ajax()调用,则不合适。在这种情况下,他们手动触发的调用可能会将$.ajaxStop事件延长到超出预期的时间。

创建值为0的变量。在每个Ajax调用的success函数中,将该值增加1,并检查该值是否等于调用总数(如果它确实执行了completeion函数)。

John Resig函数求值顺序,单位为$(文档)。准备:

每次使用新函数时 添加到队列中,它只是被添加到一个数组中,然后 执行时再次弹出。如果没有,请告诉我 发生在你身上

$.readyList-仅在1.4之前的版本中

jQuery公开了一个名为
$.readyList
的属性,它是一个允许函数顺序操作的数组

黑客方式

您可以尝试
$(窗口).load(函数(){}),它应该在整个窗口加载后执行(而不是在文档准备就绪时,就像
$(document.ready()一样)

异步请求按顺序发出,但将以它们首先完成的任何顺序返回。因此,没有确定的发出方式强制它们同时结束,但是,您可以构建规则,仅在某些组返回后运行代码

例如,使用一组规则定义回调函数,并将其传递给所有ajax请求的每个
success
callback

var completedObject = {};

function groupSuccessCallback() {
  // Test for any combination of requirements
  if ( completedObject.ajax1 && completedObject.ajax2 ) {
    ... // Do something that only requires 1 and 2
  }
  if ( completedObject.ajax1 && completedObject.ajax2 && completedObject.ajax3) { 
    ... // Do something that requires all 3 being done
        // your data is available at completedObject.ajax#
  }

  // Or test for _all_ entries for a dynamic count
  var allComplete = true;
  for(var i in completedObject) {
     if ( completedObject.hasOwnProperty(i) && !completedObject[i] ) {
       allComplete = false;
     }
  }

  // Do whatchya need.
  if (allComplete) { 
    alert("bb-b-bb-b-b-b-bbb... that's all folks!");
  }
}
然后在成功函数中设置标志:

// Ajax1
completedObject['anything'] = false; // instantiate a dynamic entry in the object or use an array if you can't use names.
$.ajax({
  ...,
  ...,
  success: function(data) {
    completedObject['anything'] = data || true;
    groupSuccessCallback();
  }
});

@Shog9您是对的。您可以只使用一个变量,因为它将始终保持在作用域中。是的。但是函数正在从页面上的不同控件添加到队列中。我想确保某些操作是在最后完成的。例如“finally”在try-catch中。如果
$.ajaxStop
事件发生,问题是我将有一个未知的编号,因为该页有这些控件的动态编号。@Ron不一定为true。$.ajaxStop仅在所有ajax调用完成后才触发。但是,如果一个调用在另一个调用能够运行之前完成,那么您将得到两个。这仍然是一个问题m、 我不能确定所有请求都是一起启动的。或者在所有请求都启动之前没有一个请求完成。老实说,此时,您已经到达了一个逻辑终结点。可以证明,没有先前的数据,您无法知道所有动态请求都已启动并完成。这是因为所有具有lready fired正在完成(尽管还会有更多)与所有请求实际触发并完成的状态相同。这本质上是停止问题:是的。但我知道在
就绪时启动的所有请求都完成了这很有趣。但是我有一个动态的控件来启动这些异步请求。自201年2月以来,我不能有一个静态的
if
1,jQuery 1.5有一个新的延迟和承诺。它符合这个目的。Find ReadyX at It声称它控制订单。但它不能与1.4.x一起工作,因为
readyList
不再可用。客观地说,你对我的解决方案有什么问题?没有问题。投票通过了。希望得到jQuery.Som的一些内部支持ething与readyList类似。您的解决方案可行,但需要涉及所有相关函数。我不确定
ReadyX
如何解决此问题。您感兴趣的是ajax调用的回调顺序,而不是dom就绪回调的顺序,对吗?如果是这样,dom就绪函数的顺序将与timi无关例如,使用
ReadyX
中的“last”队列,我可以开始监控
$.ajaxStop,知道如果我在主
ReadyX`队列中启动它们,我保证所有ajax请求都已经启动(可能已经结束)