簡體   English   中英

Node js的回調隊列排序

[英]Callback queue ordering of Node js

范例1:

console.log('Starting app');

setTimeout(() => {
  console.log('callback 1');
}, 2000);

sleep(4000);

setTimeout(() => {
  console.log('callback 2');
}, 1000);

console.log('Finishing up');

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

//Its Output
Starting app
Finishing up
Callback 1
Callback 2

范例2:

console.log('Starting app');

setTimeout(() => {
  console.log('callback 1');
}, 2000);

sleep(4000);

setTimeout(() => {
  console.log('Callback 2');
}, 0);

console.log('Finishing up');

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

//Its Output
Starting app
Finishing up
Callback 2
Callback 1

我試圖了解兩個異步函數計時器開始同時開始執行或一個接一個地執行。
Example 1如我預期的那樣工作正常。 回調1首先到達隊列,因為它的超時時間為2秒。 因為在回調2之前有4秒的延遲。

Example 2此示例無法正常工作。 應該先在隊列中到達回調1,因為它的超時為2秒,延遲為回調2前的4秒。

似乎假設sleep功能的循環在超時可能成為問題之前不會完成。

 console.log('Starting app'); sleep(4000); console.log('Finishing app'); function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds){ console.log('breaking'); break; } } console.log(`Sleep time: ${new Date().getTime() - start}ms`); } 

循環完成的時間取決於運行的計算機,但是大多數現代計算機永遠都不會中斷,因為它完成的時間比分配的時間快。 這會產生一定范圍的“睡眠”時間,這可能導致在不同的機器上獲得不同的輸出(如果增量足夠小,則兩次運行之間同一台機器上的輸出也會不同)。

例如,在我的一台機器上,此代碼需要花費約800毫秒(750毫秒至830毫秒的范圍)來完成。 比指定的4000ms短得多。

因此,在第一個測試示例中,代碼將在我的計算機上按以下方式運行:

  • 設置2000ms的超時時間以輸出“回調1”
  • 循環約800毫秒(不需要4000毫秒)
  • 設置輸出“回調2”的超時時間為1000ms

這導致“回調2”在約1800ms處打印,而“回調1”在約2000ms處打印。 考慮到它們之間的距離,我敢冒險您正在使用的機器執行該循環要慢一些,因此您可以按照指示的方式觀察它。

在第二個測試示例中,代碼將在我的計算機上這樣執行:

  • 設置2000ms的超時時間以輸出“回調1”
  • 循環約800毫秒(不需要4000毫秒)
  • 將超時時間設置為0ms,以輸出“回調2”

這導致“回調2”在約800毫秒處打印,而“回調1”在約2000毫秒處打印。 由於您的計算機速度足夠快,可以在4秒內完成循環,因此您現在可以觀察到問題中指出的“意外”輸出。

因此,基本上,您用來“睡眠”的循環並沒有提供您基於期望的等待時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM