Javascript异步功能无法正常工作

时间:2013-03-04 10:39:06

标签: javascript asynchronous

我有以下示例:

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();  
 }  

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

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)  

1 个答案:

答案 0 :(得分:1)

当前一次回调调用仍在运行时,

setInterval将不会触发对回调的下一次调用。由于您的sleep函数绝不是异步的,因此它会阻止后续setInterval次回调。

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

可以使用网络工作者做类似的事情,但是,如果你有长期运行的操作,你想要运行主JavaScript线程(在browsers that support them上)。