nodejs中的異步回調機制


1.再次clear Timer定時器的作用

setTimeOut絕非是傳統意義上的“sleep”功能,它做不到讓主線程“熄火”指定時間,它是用來指定:某個回調在固定時間后插入執行棧!(實際執行時間略長於這個固定時間)

2.js或nodejs想"sleep"主線程怎么做?

可以自定義sleep休眠函數,原理就是 目標時間 >= 當前時間+sleepTime; 然后不斷在while中tick時間、比較。直接看代碼吧。

function sleep(numbermsec){
  let now = new Date().getTime();
  let desc = now+numbermsec;
  while( now<desc ){
    now = new Date().getTime();
  }
}

3.js/nodejs的回調到底什么時候執行?可以回調了就執行還是等主線程執行完才執行?做個實驗驗證一下。

const fs = require('fs');
//異步讀文件
fs.readFile( __dirname+'/15_fs.js','utf8',(err,data) =>{
  if( err ){
    console.log( 'whoops!' );
    throw err;
  }else{
    console.log( 'success!' );
  }
} );
//異步執行setTimeout
setTimeout(() => {
  console.log( 'settimeout!' );
}, 1000);
console.log( 'time1:'+new Date().getTime() );
//主程序sleep休眠
function sleep(numbermsec){
  let now = new Date().getTime();
  let desc = now+numbermsec;
  while( now<desc ){
    now = new Date().getTime();
  }
}
sleep(3000);
//主程序執行同步讀文件操作
let buf = fs.readFileSync(__dirname+'/15_fs.js','utf8');
console.log( buf );
console.log( 'time2:'+new Date().getTime() );

打印結果:

打印結果分為5部分,從上到下5種顏色,分別標記為1,2,3,4,5:

1.打印主程序的第一個時間戳:time1

2.主程序的同步讀文件操作並打印

3.打印主程序的第二個時間戳,time2,很清晰的看到2、3的執行時間比1晚了大約3000ms

4.執行異步的setTimeout回調函數

5.執行異步讀文件的回調函數

綜上分析可知:

js/nodejs的異步操作是在“整個主程序”都解析執行完畢之后,才執行!

 ——學無止境,保持好奇。May stars guide your way.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM