內容:回調函數;阻塞/同步、非阻塞、和非同步區別;阻塞和非阻塞代碼實例 Node.js 回調函數Node.js 非同步編程的直接體現就是回調。非同步編程依托於回調來實現,但不能說使用了回調後程式就非同步化了。回調函數在完成任務後就會被調用,Node 使用了大量的回調函數,Node 所有 API 都支持回調函 ...
內容:回調函數;阻塞/同步、非阻塞、和非同步區別;阻塞和非阻塞代碼實例
Node.js 回調函數
Node.js 非同步編程的直接體現就是回調。
非同步編程依托於回調來實現,但不能說使用了回調後程式就非同步化了。
回調函數在完成任務後就會被調用,Node 使用了大量的回調函數,Node 所有 API 都支持回調函數。
例如,我們可以一邊讀取文件,一邊執行其他命令,在文件讀取完成後,我們將文件內容作為回調函數的參數返回。這樣在執行代碼時就沒有阻塞或等待文件 I/O 操作。這就大大提高了 Node.js 的性能,可以處理大量的併發請求。
阻塞/同步:打一個電話一直到有人接為止
非阻塞:打一個電話沒人接,每隔10分鐘再打一次,知道有人接為止
非同步:打一個電話沒人接,轉到語音郵箱留言(註冊),然後等待對方回電(call back)
####################################################################################
阻塞代碼實例
input.txt:love A
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("程式執行結束!");
執行結果:
love A
程式執行結束!
####################################################################################
非阻塞代碼
var fs = require("fs"); function foo(err, data) { if (err) return console.error(err); console.log(data.toString()); } fs.readFile('input.txt',foo); console.log("程式執行結束!");
執行結果:
程式執行結束!
love A
回調函數一般作為參數的最後一個參數出現:
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }
像上面的例子
這個還不是很明白,這裡看到阻塞的代碼,readFileSync,sync這個應該是同步的方法,所以一定要執行完畢,第二個例子的readFile是非同步的方法,不阻塞,直接進行下一個步驟。