本篇文章給大家介紹一下Nodejs中的callback回調。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
什么是callback? 很顯然,字面意思就是回調
那為什么在Node中需要回調操作呢?了解過Node的同學可能會知道,就是為處理異步操作的結果。
下面就是針對這個問題來詳細說一下:
在說異步操作的callback回調之前,我們先看一下同步的操作模式:
function processData () { var data = fetchData (); data += 1; return data; }
這種同步模式一般情況下可以正常工作,在其他開發(fā)環(huán)境下這種操作也是很典型的。然后可以明顯的看到fectData方法如果在加載數(shù)據(jù)的時候很耗時,就會造成在數(shù)據(jù)同步加載完成之前整個程序阻塞的情況。
Node.js是一個異步的操作處理的平臺,其使用callback回調的形式將不會被類似于文件I/O操作等阻塞。一個回調函數(shù)就是在一個給定的任務執(zhí)行完成之后執(zhí)行的函數(shù);這種方式可以避免一些阻塞的情況,同時允許其他的代碼繼續(xù)執(zhí)行。
我們使用Node.js的回調的形式去處理上面的同步操作fetchData耗時的情況:
function processData (callback) { fetchData(function (err, data) { if (err) { console.log("An error has occurred. Abort everything!"); return callback(err); } data += 1; callback(data); }); }
一開始看的話,確實會覺得有些復雜,不太容易理解,但是確實很重要,因為回調處理異步操作是Node.js的基礎。
callback回調的意思就是:你的異步操作完成之后,你就執(zhí)行我的callback回調里面的內容。
Node.js這種回調處理異步操作的形式允許我們盡可能多的處理并發(fā)操作(操作類似于IO操作)
舉個例子:
在一個web服務上,前面有幾個請求,由于某種原因阻塞了,同時之后還會有成百上千的請求正在發(fā)出;
Node.js會如何處理這種異步阻塞的情況呢?
其會執(zhí)行異步的執(zhí)行阻塞查詢,使之后的查詢請求可以正常工作,而不是說等待前面的阻塞請求結束之后,才去處理之后的請求。
下面是是使用異步函數(shù)的典型格式:
function asyncOperation ( a, b, c, callback ) { // ... lots of hard work ... if ( /* an error occurs */ ) { return callback(new Error("An error has occurred")); } // ... more work ... callback(null, d, e, f); } asyncOperation ( params.., function ( err, returnValues.. ) { //This code gets run after the async operation gets run });
callback一般是異步函數(shù)的做后一個參數(shù),當異步操作結束之后,去調用這個callback。
一般情況下,callback的第一個參數(shù)是error
如果異步操作遇到了錯誤,就會去調用callback,第一個參數(shù)是一個Error對象;反之,第一個error為null,其他參數(shù)正常返回。