纯无阻塞代码,如何实现?

时间:2013-07-05 08:19:46

标签: javascript

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

我找到了这样的代码段 enter image description here

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

2 个答案:

答案 0 :(得分:3)

Javascript作为单个执行线程运行(除了webworkers - 甚至它可以变化)。看起来它像uses an task queue一样多任务; setImmediate()函数只是在任务队列的末尾添加了该函数。

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

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

答案 1 :(得分:0)

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

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