Javascript 如何确保函数中的jQuery代码在其他函数之前执行

Javascript 如何确保函数中的jQuery代码在其他函数之前执行,javascript,jquery,ajax,onchange,Javascript,Jquery,Ajax,Onchange,我在对我的服务器执行AJAX调用的函数中遇到了非常奇怪的行为 下面的代码来自我的jQuery脚本。下面显示的两个函数在我的脚本中按此顺序显示。如果您遵循这些警报,它们将记录整个脚本的处理顺序 对于我的脚本过程来说,奇怪的、无法解释的、坦率地说是有问题的是,$.ajax()调用在我需要时没有执行。它最后被执行 我的脚本编码有问题吗 $(document).ready(function() { $(window).load(function() { $('#agentID').chan

我在对我的服务器执行AJAX调用的函数中遇到了非常奇怪的行为

下面的代码来自我的jQuery脚本。下面显示的两个函数在我的脚本中按此顺序显示。如果您遵循这些警报,它们将记录整个脚本的处理顺序

对于我的脚本过程来说,奇怪的、无法解释的、坦率地说是有问题的是,
$.ajax()
调用在我需要时没有执行。它最后被执行

我的脚本编码有问题吗

$(document).ready(function() {
  $(window).load(function() {

    $('#agentID').change(function() {
    alert('This alert displays on screen First');
      $.ajax({
        url: '/scripts/ajaxAgent.php',
        type: 'GET',
        dataType: 'html',
        data: 'lookup=' + $('#agentID').val(),
        success: function(data) {
          if (data == 1) {
    alert('Oddly and incorrectly, this alert displays on screen Third');
            $('.visibility').show();
            $('#resTypeID').closest('div').removeClass("optional");
            $('#resTypeID').closest('div').addClass("required");
          }
          else {
    alert('Oddly and incorrectly, this alert displays on screen Third');
            $('.visibility').hide();
            $('#resTypeID').closest('div').removeClass("required");
            $('#resTypeID').closest('div').addClass("optional");
          }
          resTypeVisibilityHandler = data; // this var is set to global at top of this script
        }, // end success
        error: function() {
          alert('An error occurred in processing.');
        } // end error
      }); // end .ajax()
    }); // end agentID .change()

    $('#agentID').focus();
    $(document).on('change', '.visibilityControl', function(event) {
    alert('This alert displays on screen Second');
    // ...
    }); // end .on('change') visibility control

  }); // end .load()
}); // end .ready()
@pep回答了我唯一的问题。出于某种原因,阻止新答案或错误答案也是如此。以下是解决方案:

“因此,您可以简单地将脚本完成时需要执行的所有代码包装成一个函数。然后,在AJAX成功结束时,您可以调用该函数,此时时间将是正确的,因为代码将按预期在示例中执行第三个。”

他明白了…这就是我们要做的


2014-12-12@13:15(GMT-5)请求SO上议院重新提出这个问题,以便我能正确地接受正确答案。

Ajax使用异步方式获取数据。现在,这意味着一旦启动数据请求,页面将继续运行其余的javascript(如果可用),并在收到数据后运行ajax的承诺。因此,这完全取决于从ajax URL返回数据所需的时间。在任何情况下,ajax都会在浏览器中的脚本几乎同时运行的情况下持续运行,但从服务器获取数据需要更多的时间。

这是预期的行为。Javascript是单线程的。像Ajax这样的函数需要一些时间来执行,因为请求和响应之间存在延迟。如果javascripts等待结果,那么它会阻塞单个线程,任何javascript代码都无法运行,直到响应出现


为了消除这种情况,javascripts使用异步非阻塞事件机制。Ajax是一个异步函数。由于AJAX调用需要时间来获得结果,因此您正在传递一个函数,以便在响应到来后执行。Javascript不会等到请求到来,js会继续执行Ajax函数下面的代码,直到响应到来。。当响应到来时,js执行您发送(回调)给Ajax函数的函数。这就是第三个警报延迟的原因。

AJAX中的A代表异步,这意味着您的ajaxhttp请求被触发,但只有在将来服务器响应时才会调用
success
函数。这就是你看到它的原因。啊,明白了。谢谢@pep。在ajax完成之前,是否还有停止脚本处理的方法?@H.Ferrence您可以使用
async:false,
,但不应该!请注意:您不想这样做,因为每当脚本被“暂停”或“等待”时,您的浏览器都会被冻结,因为呈现UI的线程与执行脚本的线程共享。因此,您可以简单地将脚本完成时需要执行的所有代码包装到函数中。然后,在AJAX成功结束时,您可以调用该函数,此时时间将是正确的,因为代码将按预期在示例中执行第三个。忽略使用
async:false
的建议,除非您愿意在整个AJAX请求期间完全牺牲页面响应能力。如果您的AJAX调用由于某种原因需要3秒钟才能响应,那么在这种情况下,您的浏览器将显示为冻结状态。