2013-03-04 40 views
0

我有下面的例子:異步的JavaScript功能不能正常工作

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) 
+5

*「恕我直言睡眠應該異步執行」*爲什麼?你沒有做任何事情來使它異步。 (也就是在'setInterval'回調中。) – 2013-03-04 10:40:51

+0

你誤解了JavaScript與線程的關係。所有代碼都在單個線程上執行,異步操作的回調必須等待線程變得閒置,然後才能自行執行。 – 2013-03-04 10:42:24

回答

1

setInterval不會觸發回調的下一個電話而之前的回調調用仍在運行。由於您的sleep函數絕不是異步的,因此它會阻止後續的setInterval回調。

在瀏覽器中,除禁止使用web workers之外,所有JavaScript代碼均在單線程上執行。它看起來像你的代碼試圖設置sleep將運行的情況,然後從setInterval後續回調將被觸發,並啓動第二個線程運行sleep。這沒有發生(見上文)。

可以利用網絡工作者做這樣的事情,不過,如果你有長時間運行的操作你想運行在主要的JavaScript線程(上browsers that support them)。