2011-11-02 35 views
0

我有一些問題使用Node.js作爲一個現有的長輪詢服務器的http客戶端。我使用'http'和'events'作爲要求。http.Clientrequest.abort()結束程序

我創建了一個包裝對象,其中包含處理http.clientrequest的邏輯。這是代碼的簡化版本。它完全按預期工作。當我調用EndMe時,它會按預期中止請求。

var http = require('http'); 
var events = require('events'); 

function lpTest(urlHost,urlPath){ 
    this.options = { 
     host: urlHost, 
     port: 80, 
     path: urlPath, 
     method: 'GET' 
    }; 
    var req = {}; 
    events.EventEmitter.call(this); 
} 

lpTest.super_ = events.EventEmitter; 
lpTest.prototype = Object.create(events.EventEmitter.prototype, { 
    constructor: { 
     value: lpTest, 
     enumerable: false 
    } 
}); 

lpTest.prototype.getData = function getData(){ 
    this.req = http.request(this.options, function(res){ 
     var httpData = ""; 

     res.on('data', function(chunk){ 
      httpData += chunk; 
     }); 

     res.on('end', function(){ 
      this.emit('res_complete', httpData); 
     } 
    }; 
} 

lpTest.prototype.EndMe = function EndMe(){ 
    this.req.abort(); 
} 

module.exports = lpTest; 

現在我想創建一堆這些對象,並使用它們來長時間輪詢一堆URL。所以我創建一個對象來包含它們,分別生成每個對象,啓動它,然後將它存儲在我包含的對象中。這是一種享受,所有存儲的長輪詢對象觸發事件並按預期返回數據。

var lpObject = require('./lpTest.js'); 
var objWatchers = {}; 

function DoSomething(hostURL, hostPath){ 
    var tempLP = new lpObject(hostURL,hostPath); 
    tempLP.on('res_complete', function(httpData){ 
     console.log(httpData); 
     this.getData(); 
    }); 
    objWatchers[hosturl + hostPath] = tempLP; 
} 

DoSomething('firsturl.com','firstpath'); 
DoSomething('secondurl.com','secondpath); 
objWatchers['firsturl.com' + 'firstpath'].getData(); 
objWatchers['secondurl.com' + 'secondpath'].getData(); 

現在這裏是它失敗的地方......我希望能夠停止一個長輪詢對象,同時讓剩下的事情繼續下去。所以很自然我嘗試添加:

objWatchers['firsturl.com' + 'firstpath'].EndMe(); 

但是,這將導致整個節點的執行停止,回到我的命令行。所有剩下的長期投票對象,都很高興地做着他們應該做的事情,突然停止。

任何想法?

+1

此代碼中存在相當多的語法錯誤,這使得它更難以測試。你可以更新這個修復缺少的需求,括號,並添加兩個實際用於測試的網址嗎? – geoffreak

+0

我已經推薦了代碼。對不起,這是我工作的內部系統,所以我無法提供一個工作系統來測試。 hostURL採用IP地址的形式,hostPath是特定的長輪詢資源。 –

回答

0

與數據返回時您只撥打getData()有什麼關係?

固定碼:

function DoSomething(hostURL, hostPath){ 
    var tempLP = new lpObject(hostURL,hostPath); 
    tempLP.on('res_complete', function(httpData){ 
     console.log(httpData); 
    }); 
    tempLP.getData(); 
    objWatchers[hosturl + hostPath] = tempLP; 
} 
+0

我沒有看到getData最初被調用的代碼在哪裏? – geoffreak

+0

希望不是......這是它打算工作的方式。 1.創建長輪詢請求併發送(對不起,我錯過了從DoSomething()返回的對象上的getData()對象 2.等待'res_complete'事件,調用getData來重新生成我的長輪詢請求 –

0

我似乎已經解決了這個,雖然我注意到完全滿意,它是如何工作:

var timeout = setTimeout(function(){ 
     objWatchers['firsturl.com' + 'firstpath'].EndMe(); 
    }, 100); 

通過延遲之後調用對象的關閉功能我似乎能夠保留程序執行。不完全理想,但我會接受!如果有人可以提供更好的方法,請隨時通知我:)