JSVM是否只在一个线程中运行?我想知道JavaScript函数是如何在VM中执行的。下面的源代码很有趣:
// include jQuery as $
function test() {
$.ajax({url:"xxx.com"})
.success(function() {alert("success 1");})
.fail(function() {alert("fail 1");});
$.ajax({url:"yyy.com"})
.success(function() {alert("success 2");})
.fail(function() {alert("fail 2");});
while(true);
}
它将使模具循环在“同时”行,永远不会弹出任何警告对话框,以显示“成功”或“失败”。我们知道在$.ajax内部,VM创建XMLHttpRequest并发送一个HTTP请求。发出两个请求后,它满足"while“行。因此,我认为JSVM:
1)一次只能处理函数调用。(函数是原子的)
2)遵循规则:先到先得。
我的想法对吗?有人能解释JSVM的内部实现吗?
更具体地说,如果使用AngularJS开发前端应用程序,我们想做一些事情,然后立即记录到远程服务器的日志,形式提交事件,如ng提交。
function ngSubmitTest() {
doA();
recordA(ajax, remoteServer); // must after doA()
}
如果recordA使用AJAX,我们应该确保在ng提交重定向页面之前完成recordA,同时杀死旧页面和VM (如果旧页面被杀死,recordA可能不会完成)。一种解决方案是使用async=false进行AJAX。我想知道还有什么解决办法吗?
谢谢。
发布于 2014-03-31 18:47:29
JS的实现取决于运行它的上下文。
每个浏览器都有自己的实现,只要遵循语言规范,他们就可以随心所欲。
如果它在一个线程或多个线程上运行,它不会困扰您,但是您可以确保JavaScript不是一种“线程”语言,它与事件循环流一起工作,在该流程中触发事件,然后触发连续函数,直到没有更多的调用为止。这就是为什么在编写“好”代码时很难在JavaScript中阻止UI的原因。
关于这是如何工作的一个很好的例子,以及事件循环和经典线程处理之间的差异,是node.js,我将给出一个例子:
假设您正在服务器上侦听请求,在请求到达2秒后,您将发送一条消息。现在,让我们假设您复制该侦听器,并且两个侦听器都做相同的事情。如果您请求服务器,您将在请求发出后2秒同时获得这两条消息,而不是一条消息在2秒,另一条消息在4秒。这意味着两个侦听器同时运行,而不是像大多数系统那样遵循线性执行。
Node运行Chrome的V8,如果你想知道,它是一个非常专业的JS解释器,当它出现的时候,它是一个故障。
https://stackoverflow.com/questions/22769205
复制相似问题