1.異步操作
- Node 採用 Chrome V8 引擎處理 JavaScript 腳本,V8 最大特點就是單線程運行,一次只能運行一個任務。
- Node 大量採用異步操作(asynchronous operation),即任務不是馬上執行,而是插在任務隊列的尾部,等到前面的任務運行完後再執行。
- 提高代碼的響應能力
2.什麼是異步
每一個任務有一個或多個回調函數(callback),前一個任務結束後,不是執行後一個任務,而是執行回調函數,後一個任務則是不等前一個任務結束就執行,所以程序的執行順序與任務的排列順序是不一致的、異步的。
這裏推薦阮一峯的Javascript異步編程的4種方法
由於系統永遠不知道用戶什麼時候會輸入內容,所以代碼不能永遠停在一個地方;
Node 中的操作方式就是以異步回調的方式解決無狀態的問題;
3.Node中回調函數的設計
對於一個函數如果需要定義回調函數:
- 回調函數一定作爲參數的最後一個參數出現:
- function foo1(name, age, callback) { }
- function foo2(value, callback1, callback2) { }
- 回調函數的第一個參數默認接收錯誤信息(錯誤優先的回調函數),第二個參數纔是真正的回調數據(便於外界獲取調用的錯誤情況):
注意:上面說到了一個錯誤優先的回調函數,因爲之後的操作大多數都是異步的方式,無法通過 try catch 捕獲異常
演示一個自己定義的錯誤優先的回調函數,判斷基數和偶數
/**
* 異步的回調的方式獲取數據
*/
function isOddOrEvenAsync(number, callback) {
if (number && typeof number === 'number') {
if (number % 2) {
callback(null, '奇數');
} else {
callback(null, '偶數');
}
} else {
callback(new Error('你傳的不是合法參數'));
}
}
isOddOrEvenAsync(19, function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});
isOddOrEvenAsync(10, function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});
isOddOrEvenAsync(0, function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});
isOddOrEvenAsync('aa', function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});