我曾经认为异步与多线程一样。多任务将并行完成。但是,在javascript中我写了这个,似乎永远不会发生dosomething
。
setTimeout(1000, dosomething)
while(true){}
为什么?
答案 0 :(得分:1)
Node.js是一种single threaded异步语言。如another answer
中所述Javascript是单线程的(Web工作者除外,但这与此示例无关,因此我们将忽略它)。这意味着setTimeout实际上是在至少一段时间之后安排一些代码在将来的某个时间执行,但只有当浏览器停止了当时在渲染线程上做的任何其他操作时,可能是渲染HTML,或执行JavaScript。
在你的例子中,while循环的执行永远不会停止,控制永远不会返回到顶层,因此永远不会执行预定的setTimeout
函数。
答案 1 :(得分:0)
多线程是实现异步编程的众多方法之一。对事件做出反应并屈服于调度程序是另一种方式,恰好是实现javascript in the browser的方式。
在您的示例中,必须允许完成让您控制并允许您调用setTimeout
的事件,以便javascript引擎可以监视超时并在其到期时调用doSomething
回调。