2017-08-29 60 views
0

超時未按預期

console.time("Time"); 
 
var i=0; 
 
setTimeout(function(){console.log("Timeout...")},500); 
 

 
while(true){ 
 
    if(i==1000000000){ 
 
    console.timeEnd("Time"); 
 
    console.log("whileloop breaking..."); 
 
    break; 
 
    } 
 
    else{i++;} 
 
}

在這段代碼中我試圖在0.5秒之後打印超時控制檯,並有一個while循環它的時間後終止大約2秒鐘,我通過記錄所花時間顯示。我預計超時,首先打印,因爲它完成在0.5秒和while循環打破應打印,需要更多的時間,但它的打印while循環打破第一,然後去爲超時 ...任何人都可以解釋堆棧跟蹤或代碼流。

+6

JavaScript是單線程的。超時無法運行,直到while循環結束。 – RobG

+0

那麼它是如何跟蹤回到超時執行while循環之後?是通過堆棧? – Abhishek

+0

超時時間預計在0.5秒內運行。調度程序不會檢查,直到它可以運行它爲止。 – RobG

回答

0

這裏是想象發生了什麼的最好方式,當你運行上面的代碼:

http://latentflip.com/loupe/?code=Y29uc29sZS50aW1lKCJUaW1lIik7DQp2YXIgaT0wOw0Kc2V0VGltZW91dChmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJUaW1lb3V0Li4uIil9LDUwMCk7DQoNCndoaWxlKHRydWUpew0KICBpZihpPT0xMDAwMDAwMDAwKXsNCiAgICBjb25zb2xlLnRpbWVFbmQoIlRpbWUiKTsNCiAgICBjb25zb2xlLmxvZygid2hpbGVsb29wIGJyZWFraW5nLi4uIik7DQogICAgYnJlYWs7DQogIH0NCiAgZWxzZXtpKys7fQ0KfQ0KIA%3D%3D!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D

讓我們明白什麼代碼發生

console.time("Time"); 
     var i=0; 
     //here a callback is registered and should be called when timer expires 
     setTimeout(function(){console.log("Timeout...")},500); 

     //since settimeout is async in nature, main thread continues 
    //to execute new line of code i.e. while loop 
     // After 500 ms when timer expires, it puts the callback in event queue, 
    // the callback will be executed as soon as it sees the main thread free, but since 
//while loop is running on main thread for 2sec, the main thread will be free //only after 2 sec (or while loop) finishes. 
     while(true){ 
      if(i==1000000000){ 
      console.timeEnd("Time"); 
      console.log("whileloop breaking..."); 
      break; 
      } 
      else{i++;} 
     } 
     // as there is no code to be executed now, main thread takes new task from 
     // event Queue, in this case the new task is callback from settimeout. 

我希望這可以幫助你瞭解一點點settimeout

+0

謝謝verymuch – Abhishek

+1

@Ahishek我的榮幸:) – Nemani

+0

@Abhishek,upvote將幫助:) – Nemani

0

As @RobG評論說:「Javascript是單線程的,直到while循環結束才能運行超時。」

但是,如果你想打印超時while循環打破在你的代碼,然後嘗試this--

console.time("Time"); 
 
var i=0; 
 
//setTimeout(function(){console.log("Timeout...")},500); 
 
setTimeout(console.log("Timeout..."),500); 
 

 
while(true){ 
 
    if(i==1000000000){ 
 
    console.timeEnd("Time"); 
 
    console.log("whileloop breaking..."); 
 
    break; 
 
    } 
 
    else{i++;} 
 
}

我剛纔刪除function(){}setTimeout ..

+0

這是怎麼來的打印Timeout 1st,請你解釋一下吧 – Abhishek

+0

這裏Timeout打印不用等待定時器過期,試用大定時器值 – Nemani

+0

謝謝,那我明白了,但是當它在它正在等待的函數內時,但是當console.log被立即調用時......爲什麼? – Abhishek

2

首先,我不會說英語很好。 但我想幫你

瀏覽器是單線程事件隊列。 如果第一個任務正在運行,則所有事件將被

看看你的代碼

您申報的setTimeout 月舉行

,該setTimeout的運行在0.5秒

但0後無法執行的setTimeout 。5秒 因爲while循環中只有一個單線程的瀏覽器

線程我準備了一個鏈接,你

Wrestling with the Browser Event Queue

Concurrency model and Event Loop

+0

謝謝你Wonbae李,​​沒有問題與你的英語......我明白了 – Abhishek