深入淺出nodejs學習筆記——非同步程式設計
高階函式:與傳統函式只能傳遞或返回規定的資料型別相比,高階函式可以返回函式,如下:
function foo(x){
return function(){
return x;
}
}
由於高階函式可以傳遞函式為引數,因此可以傳遞不同型別的函式來實現不同的功能,更加靈活
使用偏函式,如果要建立一組函式,比如isFunction,isString等功能類似的函式,如果每個都獨自定義會很麻煩,可以使用統一的方式定義,通過引數的傳遞讓這個函式像工廠一樣生產類似的函式,程式碼如下:
var isType = function(type){
return function(obj){
returntoString.call(obj) == ‘[object’ + type + ‘]’;
}
}
var isString = isType(‘String’);
這樣就可以取代如下複雜麻煩的分別定義方法:
var isString = function(type){
return function(obj){
returntoString.call(obj) == ‘[object String]’;
}
}
……
非同步程式設計的難點:
1、 異常處理方面,不能使用try-catch方法
非同步I/O的實現主要包括兩個階段:提交請求和處理結果
非同步方法的定義:
var async = function(callback){
process.nextTick(callback);//nextTick()表示下一個事件迴圈
}
try/catch方法只能捕獲當此事件迴圈內的異常,不能捕獲callback執行時丟擲的異常
編寫非同步方法的原則:必須執行呼叫者傳入的回撥函式;正確傳遞迴異常供呼叫者判斷。示例程式碼:
var async = function(callback){
process.nextTick(function(){
var result = something;
if(error){
return callback(error);
}
Callback(null,result);
})
}
2、 函式巢狀過深
3、 阻塞程式碼(js中沒有類似sleep()的執行緒沉睡功能)
4、 多執行緒程式設計
事件釋出/訂閱模式:
//訂閱
emitter.on(“event1”,function(message){
console.log(message);
});
//釋出
Emitter.emit(’event1’, “I am a message!”);
這裡利用on和emit方法,對物件的事件進行偵聽和釋出
關於EventListener
EventEmitter是nodejs核心的一部分。很多nodejs物件繼承自EventEmitter,用來處理事件,及回撥。來看API中的例子
Javascript程式碼
var util = require("util");
var events = require("events");//EventEmitter通過events模組來訪問
function MyStream() {//新建一個類
events.EventEmitter.call(this);
}
util.inherits(MyStream, events.EventEmitter);//使這個類繼承EventEmitter
MyStream.prototype.write = function(data) {//定義一個新方法
this.emit("data", data);//在此觸發名為"data"事件
}
var stream = new MyStream();
stream.on("data", function(data) {//註冊監聽器,監聽名為"data"事件
console.log('Received data: "' + data + '"');
})
stream.write("It works!"); // Received data: "It works!"
通過繼承EventEmitter可為物件註冊和觸發相關事件。
實現一個繼承EventEmitter的類的例項:
var events = require(‘events’);
function Stream(){
event.EventEmitter.call(this);
}
util.inherits(Stream,events.EventEmitter);
//util模組中封裝了整合的方法