nodejs學(xué)習(xí)筆記
標(biāo)簽:node 異步 回調(diào) 單線程
1. callback 最簡(jiǎn)單的回調(diào)
function test(sth){
console.log(sth)
}
function testCallback(callback,sth){
var sth=sth+"is cool";
callback(sth)
}
testCallback(test,"jade")
注意回調(diào)的理解:
將后續(xù)邏輯封裝的到一個(gè)起始函數(shù)中作為參數(shù),逐層嵌套。
其實(shí)仔細(xì)想想一般場(chǎng)景就是在一個(gè)函數(shù)中先加工參數(shù),再把加工好的參數(shù)傳給另一個(gè)函數(shù)。
2. 同步和異步的理解:
同步:想象成向老板查詢東西,老板接到電話說我?guī)湍悴椴榘?,就查啊查,查到結(jié)果了就告訴你
異步:打電話查東西,老板說我查到了再打電話給你
差不多就這個(gè)意思,同步單線程順序執(zhí)行,瀏覽器中加載代碼就是同步的,前面寫個(gè)死循環(huán),會(huì)阻塞后面代碼執(zhí)行(瀏覽器中雖然可以并行下載,但不能并行執(zhí)行)
順序執(zhí)行,下面代碼當(dāng)然執(zhí)行結(jié)果是2
var a=1;
function add(){
a++
}
function print(){
console.log(a)
}
add()
print()
如果我們將add函數(shù)改造一下,加入延時(shí)會(huì)怎么樣?
var a=1;
function add(){
//a++
setTimeout(function(){
a++
},0)
}
function print(){
console.log(a)
}
add()
print()
醬紫,會(huì)打印什么?
打印出來的是1?黑人問號(hào)
理解下啊,瀏覽器遇到setTimeout就會(huì)把它放到一個(gè)延時(shí)序列里,這個(gè)延時(shí)序列的執(zhí)行時(shí)機(jī)時(shí)其他代碼執(zhí)行完畢,so延時(shí)0秒也不執(zhí)行就不奇怪了吧
如何避免這個(gè)問題,如何避免這個(gè)問題,當(dāng)然是把函數(shù)加到setTimeout的里面咯,like this:
function add(callback){
//a++
setTimeout(function(){
a++
callback()
},0)
}
不要看到calbback就發(fā)毛,這個(gè)東西就是個(gè)回調(diào)函數(shù)