2013-02-16 59 views
0

我想了解Node.js中的事件循環,以及事件編程如何工作。鑑於我的模塊導出的函數返回東西data事件的回調:不是異步函數和Node.js的事件循環,這是如何工作的?

var http = require('http'); 

module.exports.send = function send(message) { 
    http.request({ hostname: 'google.com' }, function (res) { 
     res.setEncoding('utf8'); 

     res.on('data', function (chunk) { 
      return chunk; 
     } 
    }); 
}; 

這可怎麼工作的?

如果正確地明白,http.request異步操作,這意味着:

  1. 被執行以http.request的呼叫;
  2. 程序控制返回到Node.js事件循環立即;
  3. 當請求最終返回某個事件(發出data事件)時,可能在幾分鐘後,send函數返回數據。之前沒有。

因此resultundefined,但實際上並非如此:

var send = require('mymodule').send; 

var result = send({}); 
console.log(result); 

回答

1

考慮的主要問題是什麼是呼叫data回調。在這種情況下,該功能是從節點內的隨機地方調用的,因此當您將return chunk;返回到該節點的那一部分時,您將而不是返回到您自己的代碼,因爲它已經完成運行。

如果您想要真正獲取該數據,則需要將自己的回調傳遞給send,這些回調將在數據返回時觸發。

module.exports.send = function send(message, callback) { 
    http.request({ hostname: 'google.com' }, function (res) { 
    res.setEncoding('utf8'); 

    res.on('data', function (chunk) { 
     callback(chunk); 
    }); 
    }); 
}; 

然後叫這樣的:

var mod = require('...'); 
mod.send('message data', function(result){ 
    console.log(result); 
}); 

請記住,data事件可以發出任意次數,所以你要收集所有的chunk值,然後調用你的回調一旦事件觸發。

+0

謝謝你,我正在尋找的解釋。很難理解事件編程的邏輯! – gremo 2013-02-16 22:05:50