1. 程式人生 > >深入淺出nodejs學習筆記——非同步程式設計

深入淺出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模組中封裝了整合的方法