【问题标题】:Threads (or something like) in javascriptjavascript中的线程(或类似的东西)
【发布时间】:2011-05-10 19:47:02
【问题描述】:

我需要让一段代码始终独立于其他代码运行。有没有办法在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);

它抛出“太多递归”。

【问题讨论】:

  • 我想看一些代码 :) 也许可以改进...
  • 好的,1) dump() 做什么? 2)如果不使用,为什么要传递参数? 3) try/catch 试图捕捉什么? =) 4) 你为什么要创建一个函数的实例?如果您删除“新”构造函数?这段代码的目的是什么?
  • 1) dump() 只打印字符串。 2)我将使用参数,为简单起见,我删除了使用。 3) 与 2 相同。 4) 这是我尝试使用示例代码,我不知道如何让它继续运行。
  • @fcalderan 回答。但是这个示例代码应该每 100 毫秒打印一次“更新”。这就是我现在想要做的。
  • 使用简化版本时问题可能不可见......无论如何开始删除“新”构造函数,看看这是否更好。然后用另一种控件替换try catch。但是如果没有看到真正的代码,很难帮助你。

标签: javascript multithreading


【解决方案1】:

我假设您询问的是在不同的线程上执行一个函数。但是,Javascript 不支持多线程。

见:Why doesn't JavaScript support multithreading?

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

【讨论】:

    【解决方案2】:

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

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

    这是网络工作者规范:http://www.whatwg.org/specs/web-workers/current-work/

    更多教程处理:http://ejohn.org/blog/web-workers/

    【讨论】:

    • 请注意,目前任何版本的 Internet Explorer 都不支持 Web Worker。
    【解决方案3】:

    去掉你传递给setTimeout()的函数的new关键字,它应该可以工作。

    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 的值是什么。

    【讨论】:

      【解决方案4】:

      window.setTimeout() 是你需要的。

      【讨论】:

      • 是的,setInterval() 就是你所需要的。
      • 我试过了,它只工作一次。如果我递归调用该函数,它会在一段时间后抛出错误“递归过多”。
      • 为什么这是 OP 需要的?它只是在一段时间后调用一段代码。哪个不是独立运行的代码或线程...
      • @Veger 这就是我想要的,每 100 毫秒调用一次代码。我怎样才能做到这一点?带有递归函数的 setTimeout 会抛出“递归过多”的错误。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-14
          • 1970-01-01
          • 2014-08-30
          • 2010-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多