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.
