新聞中心
回調(Callback)是javascript中常用的使用方法,簡單而言,就是:函數(shù)作為參數(shù)傳遞到另一個函數(shù)中,然后被調用,下面為大家詳細講解一下Node.js 中的回調(Callback)函數(shù)具體方法。

成都創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網技術服務公司,擁有項目網站建設、成都網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元耀州做網站,已為上家服務,為耀州各地企業(yè)和個人服務,聯(lián)系電話:18980820575
同樣,在Node.js中,比如I/O操作發(fā)生的地方,經常使用回調模式。通過在回調函數(shù)中嵌套回調函數(shù),可以控制事情的順序(使用回調的根本出發(fā)點),比如從數(shù)據(jù)庫讀取數(shù)據(jù)后通過回調用另一個函數(shù)處理數(shù)據(jù)。
以下是一個最簡單的例子:
function a() {
return 1
}
function b(aa) {
return 2 + aa
}
//調用:
var c=0
c = b(a()) //A是個函數(shù),但它又作為一個參數(shù)在B函數(shù)中被調用
console.log(c) //結果顯示3
以上例子極易理解,下面再引入另一個概念:異步
看以下代碼:
var a = 0
function bb(x) {
console.log(x)
}
function timer(time) {
setTimeout(function () {
a=6
}, time);
}
//調用:
console.log(a)
timer(3000)
bb(a)
以上代碼很簡單,我們需要的邏輯是,全局變量a初值為0,然后過3秒后,讓它為6,然后再打印出來,看上去,上面的代碼沒有問題,理論上符合我們的邏輯需求,但卻發(fā)現(xiàn)結果是這樣:
0
0
咋回事?
因為JS是一種異步執(zhí)行語言,盡管timer函數(shù)內讓a=6了,但是JS不會死等時間結束再跳出函數(shù),而是馬上就會執(zhí)行下一步語句(即調用bb函數(shù)),但這時候3秒鐘根本就沒結束,a還沒有被重新賦值,所以打印出來還是為0。
用回調函數(shù)可以解決這個問題:
var a = 0
function bb(x) {
console.log(x)
}
function timer(time, callback) {
setTimeout(function () {
a = 6
callback(a);
}, time);
}
//調用:
console.log(a)
timer(3000,bb)
這次,在timer函數(shù)中添加了一個關鍵字callback,意思就是說此處不是一個普通的參數(shù),而是一個函數(shù)名,打起精神,關鍵的地方來了:
一般而言,函數(shù)的形參是指由外往內向函數(shù)體傳遞變量的入口,但此處加了callback后則完全相反,它是指函數(shù)體在完成某種使命后調用外部函數(shù)的出口!這時候應該明白什么叫”回調”了吧,也就是回頭調用外部函數(shù)的意思。
在本例中,當3秒鐘到了后,首先a=6,然后通過關鍵字callback(a)調用了函數(shù)bb(x),結果顯示:
0
6
這個邏輯,符合我們的需求。
在寫法上,也可以不需要定義函數(shù)bb, 直接在調用timer的時候寫成function形式,把調用部分改成這樣也可以,效果完全一樣:
console.log(a)
timer(3000, function (x) {
console.log(x)
})
這種寫法函數(shù)名都不需要了(術語稱為”匿名函數(shù)”),在nodejs代碼中更為常見也更好理解,翻譯成自然語言就是:定時3秒,完成后再回頭調用function(x)里面的內容。
nodejs編程中大量使用了異步編程技術,這是為了高效使用硬件,同時也可以不造成同步阻塞。其實nodejs在底層還是通過多線程技術實現(xiàn)的異步操作,但普通用戶并不需要深究它的實現(xiàn)方法,我們只要做好我們的異步處理即可。
當前名稱:詳解Node.js中的回調(Callback)函數(shù)
分享路徑:http://m.5511xx.com/article/dpehsoo.html


咨詢
建站咨詢
