2014-03-31 21 views
0

JSVM是否只在一个线程中运行? 我想知道如何在VM内部执行JavaScript函数。下面 的源代码是有趣:执行JavaScript函数的模型

// 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-submit中记录一个日志到远程服务器。

function ngSubmitTest() { 
    doA(); 
    recordA(ajax, remoteServer); // must after doA() 
} 

如果recordA使用AJAX,我们应该确保recordA完成之前,NG-提交重定向页面同时杀掉旧的一页,也是VM(如果旧的页面被杀害,该recordA可能无法完成)。一种解决方案是使用async = false进行AJAX。我想知道是否有其他解决方案?

谢谢。

回答

0

JS的实现取决于你正在运行它的上下文。

每个浏览器都有它自己的实现,只要他们遵循语言规范,他们可以做任何他们想做的事情。

它不应该打扰你,如果它运行在一个或多个线程上,但你可以肯定JavaScript不是一种“线程”语言,它与事件循环流一起工作,在事件循环流中触发一个事件,并且连续在此之后,功能被解雇,直到没有其他任何东西可以打电话。这就是为什么在编写“好”代码时很难阻止JavaScript中的用户界面。

这是如何工作的,以及介乎事件循环和经典穿线个体差异,是Node.js的,我给你一个例子一个很好的例子:

Supose你正在听一台服务器上的请求,并且在请求到达2秒后,您将发送一条消息。现在我们假设你复制这个监听器,并且两个监听器都做同样的事情。如果您请求服务器,则会在请求发出后2秒钟同时收到两条消息,而不是2秒钟发送一条消息,另一条消息发送4秒。这意味着两个监听器都在同时运行,而不像大多数系统那样遵循线性执行。

节点运行Chrome的V8,如果你想知道,这是一个非常专业的JS解释器,它是一个突破,当它出来。

+0

谢谢user3417400〜 –