当前位置: 首页 > 面试题库 >

是否可以确保事件处理程序在调用AJAX回调之前完成?

符允晨
2023-03-14
问题内容

假设我有一个事件处理程序,它对服务器进行了两次AJAX调用:

$("#foo").click(function(){ 
    $.get("bar", function(){ alert("Hello"); });
    $.get("baz", function(){ alert("World"); });
});

我意识到,调用回调的顺序是不确定的,因为它取决于每个请求花费的时间等。

但是,这是我的问题:是否可以保证在调用两个回调函数之前到达事件处理程序的末尾?我已经读过页面的所有Javascript都在一个线程中执行,因此我认为这意味着click在可以调用任何回调之前,一定要完成我的事件处理程序。

这样对吗?还是有可能第一个请求可能已经完成,并且在我们到达事件处理程序的结尾之前就执行了第一个回调?


问题答案:

是的,这是可以保证的,而且您是对的-只有一个线程(暂时不考虑web-worker)。当一段JavaScript代码执行(占用执行线程)并且AJAX回调到达(或任何其他GUI事件,超时等)时,它将排队并等待直到执行线程空闲(当前代码段完成)。

JavaScript引擎将永远不会中断正在运行的代码来处理传入事件-事件将始终在队列中轻轻等待。这就是在执行CPU密集型代码时GUI似乎冻结的原因-
不处理任何事件。这也是同步AJAX请求不正确的原因。



 类似资料:
  • 问题内容: 前几天,当我的程序尝试使用在另一个线程上创建的处理程序向该线程发送消息时,抛出NullPointerException。尽管调用线程已经在另一个线程上调用了start,但是尚未创建另一个线程创建的处理程序,或者该调用程序尚未看到该线程。这种情况很少发生。几乎每个测试运行都不会获得异常。 我想知道最好的方法是以最小的复杂性和性能损失来确保避免此问题。该程序是一款游戏,对性能非常敏感,尤其

  • 我已就有关守则作出评论。我通过反复试验发现,我必须在事件处理程序和命名回调中都使用bind,才能使事情正常工作。

  • 问题内容: 我之前在jQuery中使用了promise-但是在将其应用于这种情况时遇到了麻烦。我更喜欢使用$ .when()和$ .done()方法来实现这一点。 据我了解,我需要构建一个$ .Deferred对象,该对象记录请求并在请求完成时触发回调。在下面的代码中,回调在ajax请求 之前 触发 , 而不是在之后触发-也许我只需要睡一会 我知道我的代码不完整,我一直在努力通过添加for循环来应

  • 我正在尝试在javaFx中为特殊需要定制一个快捷方式系统。 这种特殊需求使得不可能使用KeyCombinaison(只限制一个键修饰符是不可接受的)。 我已经做了我适当的KeyCompin联络员系统,现在我想从节点调用一个处理程序(我在控制器之外)。但是我找不到任何优雅的解决方案来执行这个。 有一个按钮声明: 在我想从我的快捷方式代码调用控制器的操作之后。 和标准控制器。 我可以做一些工作,例如使

  • 问题内容: 我正在尝试使用jQuery在特定端口上运行AJAX查询: 这不起作用:没有进行AJAX调用,并且Firebug中没有任何异常。如果我不指定端口,它确实可以工作。有人知道为什么吗? 问题答案: 由于“ 同源来源”政策而无法使用。仅在相同的域,协议和端口中才允许AJAX请求。 如果您确实需要从该来源获取数据,则应该期待JSONP。

  • 问题内容: 嗨,下面的Javascript是在我提交表单时调用的。它首先从文本区域分割一堆网址,然后: 1)在表格中为每个网址添加行,并在最后一列(“状态”列)中显示“未开始”。 2)再次循环遍历每个URL,首先它进行ajax调用以检查状态(status.php),该状态将返回0到100之间的百分比 。3)在同一循环中,它通过ajax启动实际过程(process.php),当进程完成时(请记住连续