node.js:while循环callback没有按预期工作

知道,虽然Node.js是asynchronous工作,写这样的事情:

function sleep() { var stop = new Date().getTime(); while(new Date().getTime < stop + 15000) { ; } } sleep(); console.log("done"); 

…将调用sleep(),在while循环(15secs)期间阻塞服务器,然后将“完成”打印到控制台。 据我所知,这是因为Node.js只允许JavaScript的主线程访问,因此这个事情的孩子会停止进一步的执行。

所以我明白这个解决scheme是使用callback:

 function sleep(callback) { var stop = new Date().getTime(); while(new Date().getTime() < stop + 15000) { ; } callback(); } sleep(function() { console.log("done sleeping"); }); console.log("DONE"); 

所以我认为这将打印“完成”,并在15秒后。 'done sleeping',因为sleep()函数被调用并被传递给一个callback函数的指针。 当这个函数正在工作(while循环)时,最后一行将被执行(print'done')。 15秒后,当sleep()函数完成时,它调用给定的callback函数,然后打印“完成睡眠”。

显然我在这里明白了一些错误,因为上述两种方式都阻止了。 请有人澄清一下吗?

在此先感谢,Slagjoeyoco

Javascript和node.js是单线程的,这意味着一个简单的块; 在while块完成之前,不能处理请求/事件。 callback不会神奇地解决这个问题,他们只是帮助传递自定义代码的function。 相反,迭代使用process.nextTick ,这将给你本质上相同的结果,但留下空间处理请求和事件,也就是说,它不会阻止:

 function doSleep(callback) { var stop = new Date().getTime(); process.nextTick(function() { if(new Date().getTime() < stop + 15000) { //Done, run callback if(typeof callback == "function") { callback(); } } else { //Not done, keep looping process.nextTick(arguments.callee); } }); } doSleep(function() { console.log("done sleeping"); console.log("DONE"); }); 

您正在呼叫sleep ,新的sleepfunction会阻止。 它保持迭代,直到满足条件。 你应该使用setTimeout()来避免阻塞:

 setTimeout(function () { console.log('done sleeping'); }, 15000); 

callback与asynchronous不同,它们只是在你想从asynchronous操作中得到一个…callback…时才有用。 在你的情况下,该方法仍然同步执行; Node不会神奇地检测到有一个callback和长时间运行,并提前返回。

真正的解决scheme是使用setTimeout而不是另一个线程上的繁忙循环。

如前所述,asynchronous执行应该由setTimeout()而不是while来完成,因为while将冻结在一个“执行框架”中。

另外,你的例子中似乎有语法错误。

这个工作正常: http : //jsfiddle.net/6TP76/