2013-12-19 77 views
0

我想寫一個服務器,在的NodeJS,可稱爲像這樣:的NodeJS,回調地獄,從裏面的回調觸發類事件

server.getData() 
    .on('complete', function(){ 
     console.log('on complete triggered'); 
    }); 

我試圖從內到emit事件response.end的回調,在http.get的回調中。像這樣:

Server = function(){ 
    events.EventEmitter.call(this); 

    this.getData = function(fn){ 

     var _cb; 
     fn ? _cb=fn: _cb=this.parseData; 
     https.get('https://api.example.com', _cb); 
     return this; 
    } 

    this.parseData = function(resp, fn){ 
     var _data = ''; 
     var self = this; 
     resp.setEncoding('utf8'); 
     resp.on('data', function(chunk){ 
      _data += chunk; 
     }); 
     resp.on('end', function(){ 
      var j = JSON.parse(_data); 
      self.emit('complete'); 
      console.log(j); 
      if(fn) 
       fn(j); 
     }); 
    } 
} 
util.inherits(Server, events.EventEmitter); 
server = new Server(); 

我迷路了,該怎麼做。接觸我的是,我可以訪問server.parseData中的_data var resp.end,但我無法對服務器對象執行相同的操作。

+0

爲什麼不能用'var Server = this;'啓動類函數? – durum

回答

2

這條線parseData不是做你所期望的:

var self = this; 

,因爲,在這一點上,this是全局對象。出現此問題的getData當你設置:

_cb=this.parseData 

既然你叫_cb()而不是this.parseData()this設置不正確內parseData。這是JavaScript中的常見問題。您可以設置selfServer功能,這將使那裏訪問它裏面聲明的所有方法,也可以將其綁定:

_cb=this.parseData.bind(this) 

這將導致this是正確的事情時,_cb被調用。