lar*_*els 2 javascript ajax jquery
很简单的问题:假设我有以下js/jquery代码
doSomething();
$.get(url, callback);
doSomethingElse();
Run Code Online (Sandbox Code Playgroud)
据我所知,在发送GET请求后,doSomethingElse()开始执行.现在假设服务器的回复在doSomethingElse()执行时到达.怎么了?
感谢您的任何见解!
拉拉
不,Web浏览器中的JavaScript是单线程的,按设计.这意味着虽然ajax调用可以立即启动(并由浏览器中的另一个线程处理),但是在JavaScript解释器下一次空闲之前不会发生回调.排队等待解释器闲置并处理它们的事情.
编辑回答您的具体问题:
回调是否在与doSomethingElse()并行的单独线程中运行?
不,回调将在与之相同的逻辑线程中运行doSomethingElse.(它是依赖于实现的,是否是相同的实际底层操作系统线程,但你无法知道并且你不关心; 从逻辑上讲,它是相同的线程.)
doSomethingElse()的执行是否暂停,直到回调运行并返回?
默认情况下,这get将是异步的,所以没有.doSomethingElse 发起请求,但随后继续.(可以通过底层的XmlHttpRequest机制进行同步获取,但这是一个非常糟糕的主意 - 在请求运行时,往往会完全锁定浏览器的UI,这很丑陋 - 我不知道如何你用jQuery做的.)
一旦doSomethingElse()返回,是否只调用回调?
使用异步get(通常类型),您可以确定doSomethingElse在调用回调之前完成,是的.这是因为JavaScript解释器一次只能执行一项操作,并且在完成当前操作之前不会切换到执行新操作.因此,虽然doSomethingElse触发get(并且get可能由与JavaScript并行的其他非JavaScript线程处理),但是在完成解释器doSomethingElse和调用它之后才会发生回调.
如果在某些时候我们开始在基于浏览器的JavaScript中获得多个线程,我不会感到惊讶,但是如果我们这样做,那么它必须是明确的,因为我们现在都很高兴地假设一个线程.
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |