非常简单的问题:假设我有以下js / jquery代码
doSomething();
$.get(url, callback);
doSomethingElse();
据我所知,在发送GET请求之后,doSomethingElse()开始执行。现在假设服务器的回复在doSomethingElse()执行时到达。会发生什么?
感谢您的任何见解!
拉拉
答案 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()将始终首先运行,但就时间/线程问题而言,我不确定。