回调是否传递给jquery的$ .get()在一个单独的线程中执行?

时间:2009-12-13 23:45:59

标签: javascript jquery ajax

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

doSomething();

$.get(url, callback);

doSomethingElse();

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

  • 回调是否在与doSomethingElse()并行的单独线程中运行?
  • doSomethingElse()的执行是否暂停,直到回调运行并返回?
  • 只有在doSomethingElse()返回后才会调用回调吗?

感谢您的任何见解!

拉​​拉

5 个答案:

答案 0 :(得分:6)

不,Web浏览器中的JavaScript是单线程的,按设计。这意味着虽然ajax调用可以立即启动(并由浏览器中的另一个线程处理),但是在JavaScript解释器下一次空闲之前不会发生回调。排队等待解释器闲置并处理它们。

修改回答您的具体问题:

  

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

不,回调将在与doSomethingElse相同的逻辑线程中运行。 (这将是依赖于实现的,无论是否是相同的实际底层操作系统线程,但您无法知道并且您不关心; 逻辑,它是相同的线程。)

  

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

默认情况下,get将是异步的,所以没有。 doSomethingElse 发起请求,但随后继续。 (可以通过底层的XmlHttpRequest机制进行同步获取,但这是一个非常糟糕的主意 - 在请求运行时,往往会完全锁定浏览器的UI,这很丑陋 - 我不知道你是怎么用jQuery做的。)

  

只有在doSomethingElse()返回后才会调用回调吗?

使用异步get(通常类型),您可以确定doSomethingElse将在调用回调之前完成,是的。这是因为JavaScript解释器一次只能执行一项操作,并且在完成当前操作之前不会切换到执行新操作。因此虽然doSomethingElse触发了get(并且get可以由与JavaScript并行的其他非JavaScript线程处理),但是在解释器完成doSomethingElse之后才会发生回调。这叫它。

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

答案 1 :(得分:2)

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

Web API所做的是利用异步回调,这就是这里发生的事情 - get()立即返回,一旦加载完成并且没有其他JS代码在运行,就会调用回调函数。 / p>

答案 2 :(得分:1)

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

因此,要专门回答您的问题,只有在doSomethingElse()返回后才会调用回调。当然,假设GET请求成功 - 如果发生错误,则永远不会执行回调。

答案 3 :(得分:0)

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

http://www.javascriptkata.com/2007/06/12/ajax-javascript-and-threads-the-final-truth/

答案 4 :(得分:-2)

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