Newbey在node.js中等待的方法 为什么它不起作用?

我尝试玩node.js,我发现有趣的(也许,只为我)的事情,我写这样的代码:

var flag = false; doSomethingAsync().on('complete', function(data) {     console.log('from callback'); //do somestuff     flag = true; }); do{ // there I want to wait for callback result }while(!flag); 

但我观察到,我没有看到从callback日志。 为什么会发生? 我试图改变…而另一个循环,但观察到相同的行为
注:我知道这是不适合在节点中的东西,但我想明白为什么发生这种情况

节点实现一个协作I / O循环,只有当程序空闲(不执行任何计算)时才检查是否执行I / O操作。 协作部分由开发人员通过执行阻塞计算而不阻塞I / O环路来实现。

do-while循环(不包含任何I / O操作本身)的问题在于,它阻止程序空闲,因此有效地阻止任何I / O(包括由doSomethingAsync执行的I / O)执行。

这可以通过使用setImmediate()稍微缓解,尽pipe在do-while循环中这不能用作原样。

永远不要这样做,不pipe语言如何。

如果您不释放CPU,则无法轻松预测引擎如何处理您启动的其他任务。 它可能决定给这个循环提供所有的资源,而不是让doSomethingAsync做任何进展,从而使循环无止境,callback永远不会被触发。

特别是在nodejs中,因为只有一个线程来执行你的javascript代码(即使其他线程在这里是IO),callback将不会被启动,直到你的循环结束(它不会这样做)。

只需在callback中或通过callback调用的函数中执行所需的操作即可:

 function goon() { // do other stuff } doSomethingAsync().on('complete', function(data) {    console.log('from callback'); //do somestuff goon(); }); 

你在做什么叫做忙等待/循环。 这会浪费你的CPU处理时间。 这在所有语言中都是不好的做法,不仅仅是在节点中。

是什么让它真的在节点坏,是它locking事件循环。 在事件循环中,每个事件处理程序都被给予CPU处理,并且必须在最后释放控制权。 当你运行一个无限循环时,它会阻塞下一个事件的执行,以及事件循环本身。

所以在你的情况下,标志不能设置为true,结束循环。 因为循环必须允许标志改变。

 var flag = false; setTimeout(function(data) { console.log('from callback'); flag = true; },2000); i=0; do{ i +=1; console.log(i); }while(!flag&&i<200); 

你的标志只会在循环结束时改变。

看到这篇文章