代码之家  ›  专栏  ›  技术社区  ›  Andres

JavaScript并行性

  •  5
  • Andres  · 技术社区  · 15 年前

    首先,我想说的是,我对互联网的发展有点陌生。

    无论如何,我想知道是否可以使用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

    5 回复  |  直到 15 年前
        1
  •  7
  •   jldupont    15 年前

    一根单螺纹 在普通Webbrowsers中的javascript中执行:您的计时器处理程序将被串行调用。你使用计时器的方法会在你提出的情况下起作用。

    有一个 nice piece of documentation on timers 作者是JohnResig(非常流行的jquery javascript框架的作者——如果你对Web开发还不熟悉,我建议你查一下)。

    现在,如果您指的是基于HTML5的浏览器,在某种程度上,它们应该具有线程支持。

        2
  •  2
  •   David Hedlund    15 年前

    是的,通过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.
    } });
    
        3
  •  2
  •   Christian C. Salvadó    15 年前

    好吧,javascript是 单线程 ,这两个计时器将依次运行,即使您没有注意到。

    我建议您看一下下面的文章,它真正解释了计时器和异步事件的工作原理,它还将帮助您了解JavaScript的单线程特性:

    作为另一种选择,你可以看看 WebWorkers ,是在单独的后台线程中运行脚本的一种方法,但它们仅受现代浏览器支持。

        4
  •  0
  •   Victor Nicollet    15 年前

    你要找的是 异步的 客户机-服务器通信(关键字:async)。异步函数立即返回,但在满足指定条件后将执行提供的回调。

    因此,如果向服务器发送请求的函数是异步的,那么您可以将这两个请求发送到服务器,而不必等待一个响应。

    使用 setTimeout 可能有效,因为这将调度两个请求发送函数来调用。但是,一些浏览器一次只运行一个javascript线程,因此结果是其中一个计划函数将运行并阻塞(等待回复),另一个计划函数将等待直到第一个函数开始运行。

    建议使用服务器通信库中的异步支持。例如,jquery默认使用异步。

        5
  •  -2
  •   Daniel A. White    15 年前

    这取决于javascript引擎。