1.Node采用Chrome V8引擎處理JavaScript腳本涵卵,V8最大的特點(diǎn)就是單線程運(yùn)行浴栽,一次只能運(yùn)行一個(gè)任務(wù)轿偎。
由于是單線程運(yùn)行典鸡,還沒執(zhí)行完的代碼會(huì)阻塞了后面的操作,如一下例子:
console.log('開始執(zhí)行了');
console.time('test');
//不斷的循環(huán)阻塞了代碼的執(zhí)行
for(var i = 0;i < 100000000;i++){
}
console.timeEnd('test');
console.log('完成執(zhí)行了');
結(jié)果:
$ node test
開始執(zhí)行了
test: 83.637ms
完成執(zhí)行了
避免不了執(zhí)行繁重的代碼坏晦,就將其放在后面椿每,可以采用setTimeout(()=>{},0)
,將耗費(fèi)時(shí)間的操作放在里面,通過借助這個(gè)函數(shù)作為一個(gè)回調(diào)將耗費(fèi)事件的操作放在事件隊(duì)列的最后一個(gè)间护。如下
console.log('開始執(zhí)行了');
console.time('test');
setTimeout(()=>{
for(var i = 0;i < 100000000000;i++){}
console.log('循環(huán)完了');
},0);
console.timeEnd('test');
console.log('完成執(zhí)行了');
結(jié)果:
$ node test
開始執(zhí)行了
test: 1.052ms
完成執(zhí)行了
循環(huán)完了
借助了回調(diào)函數(shù),執(zhí)行的順序就變了挖诸。
有個(gè)問題就是汁尺,上面那段for循環(huán)代碼對(duì)下面的操作沒有影響,下面并沒有用到上面的數(shù)據(jù)多律,如果下面的代碼依賴上面的,就不能這樣 狼荞。在node中辽装,通常采用回調(diào)的方式異步執(zhí)行。
2.Node大量采用異步操作相味,即任務(wù)不是馬上執(zhí)行拾积,而是插在任務(wù)隊(duì)列的尾部,等到前面的任務(wù)運(yùn)行完后再執(zhí)行丰涉。
回調(diào)函數(shù)的設(shè)計(jì):
- 對(duì)于一個(gè)函數(shù)如果需要定義回調(diào)函數(shù):
--回調(diào)函數(shù)一定作為參數(shù)的最后一個(gè)參數(shù)出現(xiàn):
function fun1(name,age,callback){}
function fun2(value,callback1,callback2){}
--回調(diào)函數(shù)的第一個(gè)參數(shù)默認(rèn)接收錯(cuò)誤信息拓巧,第二個(gè)參數(shù)才是真正的回調(diào)數(shù)據(jù)(便于外界獲取調(diào)用的錯(cuò)誤情況):
fun1('jack',19,function(error,data){
if(error) throw error;
console.log(data);
})
強(qiáng)調(diào)錯(cuò)誤優(yōu)先:
- 因?yàn)橹蟮牟僮鞔蠖嗍钱惒降姆绞剑瑹o法通過try catch捕獲異常一死,所以錯(cuò)誤優(yōu)先的回調(diào)函數(shù)(第一個(gè)參數(shù)為上一步的錯(cuò)誤信息)