0

通过教程 http://channel9.msdn.com/Events/Patterns-Practices-Symposium-Online/pattern-practices-symposium-2013/Windows-8-JavaScript

我找到了这样的代码片段 在此处输入图像描述

但是如果您看到方法 not_blocking(),它仍在等待 doExpensiveComputationOn() 方法完成(尽管只是第一次)。我什至可以绕过它吗?所以它甚至不等待昂贵方法的单个调用。

4

2 回答 2

3

Javascript 作为单个执行线程运行(webworkers 除外 - 即便如此它也可能会有所不同)。它看起来好像是多任务处理,因为它使用任务队列;setImmediate() 函数只是将函数添加到任务队列的末尾。

setimmediate 函数是 MSIE 唯一的函数,我建议不要使用它。你可以用 setTimeout(processNext, 0); 做类似的事情。虽然语义在某些浏览器上与 window.onload 事件略有不同)或在最新版本的 javascript 中使用yield() / generator 构造。

Webworkers或单独的框架/窗口是让 javascript 真正并行运行的唯一方法。

于 2013-07-05T08:37:28.813 回答
0

所做not_blocking的只是在数组中的每个项目之后延迟执行,以便可以在两者之间处理 UI(和其他)事件。

如果您希望函数立即返回,只需将最后一行从 更改processNext()setImmediate(processNext);。但是doExpensiveComputationOn在某些时候仍然会阻塞这个线程。正如 Sirko 评论的那样;如果您担心阻塞主线程,请使用后台工作程序。

于 2013-07-05T08:35:48.260 回答