代码之家  ›  专栏  ›  技术社区  ›  Tom Brito

javascript中的线程(或类似线程)

  •  5
  • Tom Brito  · 技术社区  · 5 年前

    我需要让一段代码始终独立于其他代码运行。有没有办法用javascript创建一个线程来运行这个函数?

    --为什么setTimeout对我不起作用

    我试过了,但只有一次。如果我递归调用这个函数,它会在一段时间后抛出错误“递归太多”。我需要它每100毫米运行一次(这是与嵌入式系统的通信)。

    --如你所问,这里有一些代码

    function update(v2) {
         // I removed the use of v2 here for simplicity
         dump("update\n"); // this will just print the string
         setTimeout(new function() { update(v2); }, 100); // this try doesn't work
    }
    update(this.v);
    

    它抛出“太多递归”。

    6 回复  |  直到 13 年前
        1
  •  2
  •   user113716    14 年前

    摆脱 new 要传递到的函数的关键字 setTimeout() ,它应该可以工作。

    function update(v2) {
     try {
         dump("update\n");
     } catch(err) {
         dump("Fail to update " + err + "\n");
     }
     setTimeout(function() { update(v2); }, 100);
    }
    update(this.v);
    

    或者只是使用 setInterval() .

    function update(v2) {
     try {
         dump("update\n");
     } catch(err) {
         dump("Fail to update " + err + "\n");
     }
    }
    var this_v = this.v;
    setInterval(function() {update(this_v);}, 100);
    

    编辑: 参考 this.v 因为我不知道 this 在你的申请中。

        2
  •  4
  •   Community CDub    7 年前

    我假设你在问关于在不同线程上执行函数的问题。但是,Javascript不支持多线程。

    见: Why doesn't JavaScript support multithreading?

    所有当前浏览器中的Javascript引擎都在一个线程上执行。如上所述,在不同线程上运行函数将导致并发问题。例如,两个函数同时修改单个HTML元素。

        3
  •  3
  •   jhurshman    14 年前

    正如这里其他人指出的,也许多线程并不是您实际需要的。setInterval可能足够了。

    但是,如果您确实需要多线程,JavaScript确实通过web workers功能支持它。基本上,主JavaScript线程只能通过事件和消息传递(本质上是字符串)与其他线程(工作线程)交互。工人无权访问DOM。这避免了任何并发问题。

    以下是web workers规范: http://www.whatwg.org/specs/web-workers/current-work/

    更多指导性治疗: http://ejohn.org/blog/web-workers/

        4
  •  2
  •   BarsMonster    14 年前

    window.setTimeout()是您需要的。

        5
  •  1
  •   Peter O. Manuel Pinto    13 年前

    也许您应该看看javascirpt工作程序(专用的Web工作程序为Web内容在后台线程中运行脚本提供了一种简单的方法),这是一篇很好的文章,它解释了如何工作以及如何使用它。 HTML5 web mobile tutororial

        6
  •  0
  •   Pau    14 年前

    你可以尝试循环而不是递归