0

我有以下示例:

var first=setInterval(function() {  
var t=new Date();  
console.log("Started: ",t);  
sleep(function(){  
    var t=new Date();  
    console.log("Finished: ",t);  
});  
},500);  

function sleep(callback){  
for (var i=0;i<10000000000;i++){  
     //waiting
  }  
  callback();  
 }  

恕我直言 sleep 应该异步执行,但它不会输出:

Started:  Mon Mar 04 2013 12:31:10 GMT+0200 (EET)  
Finished:  Mon Mar 04 2013 12:31:23 GMT+0200 (EET)  
Started:  Mon Mar 04 2013 12:31:24 GMT+0200 (EET)  
Finished:  Mon Mar 04 2013 12:31:36 GMT+0200 (EET)  
Started:  Mon Mar 04 2013 12:31:36 GMT+0200 (EET)  
4

1 回答 1

1

setInterval不会在上一次回调调用仍在运行时触发下一次回调调用。由于您的sleep函数绝不是异步的,因此它支持后续setInterval回调。

在浏览器中,除非使用web worker,所有 JavaScript 代码都在单个线程上执行。看起来您的代码正在尝试设置sleep将要运行的情况,然后setInterval将触发后续回调并启动第二个线程 running sleep。这不会发生(见上文)。

但是,如果您有长时间运行的操作,您希望在主 JavaScript 线程上运行(在支持它们的浏览器上),您可以使用 Web Worker 来执行类似的操作。

于 2013-03-04T10:42:35.297 回答