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

How to ensure jQuery code within a function is executed before other functions

本文关键字:函数 代码 其他 执行 jQuery 何确保 确保      更新时间:2023-09-26

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

下面的代码是从我的jQuery脚本中提取的。下面显示的 2 个函数在我的脚本中完全按照这个顺序出现。如果遵循警报,它们将记录整个脚本的处理顺序。

奇怪的,无法解释的,坦率地说,我的脚本过程有问题,$.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有我独特问题的答案。由于某种原因,SO阻止了新答案或错误答案。这是解决方案:

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

他知道了...这就是解决方法!

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

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

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

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