JavaScript并行性

5

首先,我想说我在互联网开发领域还有点新手。

无论如何,我正在尝试了解是否可能使用JavaScript并行运行两个代码片段。

我真正需要的是调用远程服务器上的两个方法。对于这两个方法,我都传递了一个回调函数,当我需要的数据准备好时就会执行它们。由于运行这些函数的服务器需要一定时间来响应,因此我正在寻找一种方法,在不必等待第一个完成以调用第二个的情况下同时调用两个方法。

像setTimeout这样的方法是否并行运行,例如

setTimeout(func1, 0);
setTimeout(func2, 0);

...

function func1()
{
   webMethod1(function() {alert("function 1 returned"); } );
}

function func1()
{
   webMethod2(function() {alert("function 2 returned"); } );
}

编辑

我刚刚发现了一篇与下一代浏览器发布可能非常有关的文章:JavaScript Web Workers

该文章介绍了一种新技术——JavaScript Web Workers,对于下一代浏览器的发布非常重要。

我不知道在其他代码仍在运行时是否会调用超时函数。你可以轻松测试它。 - user181351
是的,问题在于我的原始代码中有很多依赖项需要检查,然后才能进行更改以实现这种方式,并且我只想在值得的情况下完成所有这些工作。 - Andres
5个回答

7
在普通的Web浏览器中,Javascript只有一个单一的线程执行:计时器处理程序将按顺序调用。在您提供的情况下,使用计时器的方法是可行的。
John Resig(非常受欢迎的jQuery Javascript框架的作者 - 如果您是Web开发新手,建议您查阅)撰写了关于计时器的精美文档
现在,如果您正在引用基于HTML5的浏览器,则它们应该具有线程支持。

虽然它们将按顺序被调用是正确的,但我要补充一点,OP使用webMethod意味着他真正想避免的是同步等待两个不同的Web请求,这可以通过AJAX避免。 - David Hedlund
@David:我们可以注意到,在浏览器中,通常可以同时与原始服务器建立至少2个连接,使得AJAX调用有效地成为并行处理的良好手段。 - jldupont

2
是的,这正是通过AJAX进行Web请求的方式。不需要将setTimeout设置为0,您可以逐个调用它们,并发出一个AJAX请求,它将异步执行,允许您传递回调函数以在请求完成时调用。
创建AJAX请求的方法因所使用的浏览器而异。如果您要构建依赖于AJAX的东西,并且希望它能够跨多个浏览器工作,最好使用一个库。例如,在jQuery中就是这样完成的:
$.ajax({ url: '/webrequesturl', success: function(result) {
    // this will be called upon a successful request
} });
$.ajax({ url: '/webrequest2url', success: function(result) {
    // this will be called upon a successful request
    // this may or may not be called before the above one, depending on how long it takes for the requests to finish.
} });

2
好的,JavaScript是单线程的,即使你没有注意到,两个计时器也会依次运行。
我建议您阅读以下文章,它真正解释了计时器和异步事件的工作原理,并帮助您理解JavaScript的单线程特性:
- How JavaScript Timers Work
另外,作为替代方案,您可以查看WebWorkers,这是一种在后台线程中运行脚本的方法,但它们仅受现代浏览器支持。

0
你需要的是异步的客户端-服务器通信(关键字:async)。异步函数会立即返回,但提供的回调函数将在满足指定条件后执行。
因此,如果向服务器发送请求的函数是异步的,这将允许您在不等待响应的情况下发送两个请求到服务器。
使用setTimeout可能有效,因为这将安排调用两个请求发送函数。然而,一些浏览器只会同时运行一个Javascript线程,所以结果将是其中一个调度函数运行并阻塞(等待回复),而另一个调度函数则等待第一个完成后开始运行。
建议使用来自您的服务器通信库的异步支持。例如,jQuery默认使用异步。

-2

这取决于JavaScript引擎。


不,所有浏览器中的JavaScript都是单线程的,而且OP正在询问在浏览器中运行的JavaScript。 - Tim Down

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接