Javascript 回调是否传递给jquery';s$.get()是否在单独的线程中执行?

Javascript 回调是否传递给jquery';s$.get()是否在单独的线程中执行?,javascript,jquery,ajax,Javascript,Jquery,Ajax,非常简单的问题:假设我有以下js/jquery代码 doSomething(); $.get(url, callback); doSomethingElse(); 我知道在发送GET请求之后,doSomethingElse()立即开始执行。现在假设服务器的回复在doSomethingElse()执行时到达。会发生什么 回调是否在与doSomethingElse()并行的单独线程中运行 doSomethingElse()的执行是否会暂停,直到回调运行并返回 回调是否只在doSomethin

非常简单的问题:假设我有以下js/jquery代码

doSomething();

$.get(url, callback);

doSomethingElse();
我知道在发送GET请求之后,doSomethingElse()立即开始执行。现在假设服务器的回复在doSomethingElse()执行时到达。会发生什么

  • 回调是否在与doSomethingElse()并行的单独线程中运行
  • doSomethingElse()的执行是否会暂停,直到回调运行并返回
  • 回调是否只在doSomethingElse()返回后才被调用
感谢您的任何见解


lara

老实说,我不知道答案,但我不会在doSomethingElse()中放置任何依赖于callback()功能的代码。我知道doSomethingElse()总是首先运行,但就计时/线程问题而言,我不确定。

不,Javascript只有一个控制线程。当前正在执行的函数将继续运行,直到完成为止,然后回调将在准备就绪后调用


因此,为了明确回答您的问题,回调函数只在doSomethingElse()返回后调用。当然,假设GET请求成功—如果发生错误,则回调将永远不会执行。

否,web浏览器中的JavaScript设计为单线程。这意味着,尽管ajax调用可能会立即启动(并由浏览器中的另一个线程处理),但在JavaScript解释器下一次空闲之前,回调不会发生。要做的事情排队等待解释器空闲并处理它们

编辑回答您的具体问题:

回调是否在与doSomethingElse()并行的单独线程中运行

否,回调将在与
doSomethingElse
相同的逻辑线程中运行。(这将取决于实现,取决于它是否是同一个实际的底层OS线程,但您无法知道,也不在乎;从逻辑上讲,它是同一个线程。)

doSomethingElse()的执行是否会暂停,直到回调运行并返回

默认情况下,
get
将是异步的,因此no.
doSomethingElse
会启动请求,但随后会继续。(可以通过底层的XmlHttpRequest机制进行同步get,但这是一个非常糟糕的主意——在请求运行时会完全锁定浏览器的UI,这很难看——我不知道如何使用jQuery实现。)

回调是否只在doSomethingElse()返回后才被调用

使用异步
get
(通常的类型),您可以确定
doSomethingElse
将在调用回调之前完成,是的。这是因为JavaScript解释器一次只做一件事,并且它不会切换到做一件新的事情,直到它完成了当前的事情。因此,尽管
doSomethingElse
触发get(并且get可能由其他非JavaScript线程与JavaScript并行处理),但只有在解释器使用
doSomethingElse
和任何调用它的程序完成后,才会发生回调


如果在某个时候我们开始在基于浏览器的JavaScript中获得多个线程,我不会感到惊讶,但是如果我们这样做了,那么它必须是明确的,因为我们现在都很乐意假设一个线程。

出于所有的意图和目的,JS中没有线程,因此不会在单独的线程上执行


web API所做的就是利用异步回调,这就是这里发生的事情——get()立即返回,一旦加载完成并且没有其他JS代码运行,您的回调函数将被调用。

这是一篇非常好的文章,说明了这一工作原理


olliej,但“没有其他JS代码运行”是什么意思?这是否意味着在下一个声明完成之后?在我运行的函数之后。get()返回什么?或者直到我的页面中的所有JS代码都执行完毕?他的意思是,如果JavaScript代码正在运行,它不会被回调中的其他JavaScript代码中断。例如,如果代码在执行A.Read()事件的中间,就绪事件中的代码必须在执行回调之前完成。谢谢您的链接,克里斯。但是读过之后,我仍然不明白什么定义了回调何时被执行。是在当前函数返回之后吗?页面上的所有JS代码何时执行?当前JS语句执行后。。。?感谢您提供的任何见解。当get请求完成时,将调用回调。因此,在后台,$.get()对您提供的脚本路径进行异步XMLHttpRequest。当该请求对象收到来自服务器的响应时,它将执行提供的回调。