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
,新的sleep
function会阻止。 它保持迭代,直到满足条件。 你应该使用setTimeout()
来避免阻塞:
setTimeout(function () { console.log('done sleeping'); }, 15000);
callback与asynchronous不同,它们只是在你想从asynchronous操作中得到一个…callback…时才有用。 在你的情况下,该方法仍然同步执行; Node不会神奇地检测到有一个callback和长时间运行,并提前返回。
真正的解决scheme是使用setTimeout
而不是另一个线程上的繁忙循环。
如前所述,asynchronous执行应该由setTimeout()而不是while来完成,因为while将冻结在一个“执行框架”中。
另外,你的例子中似乎有语法错误。
这个工作正常: http : //jsfiddle.net/6TP76/