2015-09-06 28 views
0

我有Node.JS服務器應用程序,它通過Web套接字與更多客戶端進行通信。現在我需要以這種方式擴展我的解決方案:每當客戶端連接到服務器並獲得唯一的ID時,就需要不斷調用一個特定的REST API端點(在某種無限循環中)客戶端ID作爲參數,以及來自REST API響應的進程更改。Node.JS - 我需要在我的應用程序無限循環中調用REST API端點

示例: - 客戶端1連接到服務器。 Web套接字打開並且通信打開。在這一點上無限循環的開始和REST端點(如/信息?的clientId =客戶端1)一次又一次地叫......

  • 5分鐘後客戶端2還連接到服務器和REST端點開始被一次又一次地調用(/ info/clientId = Client2)。

  • 突然/ info?clientId = Client1返回已更改的數據,現在是時候做出反應了。我將發送給打開網絡插座,但無限循環,一些特殊的響應還是應該爲客戶端1和客戶機上運行2

這應該是相同的所有客戶端(在同一時間也有新的連接的客戶端時,一些其他客戶正在服務)。

我不知道我應該如何實現這個循環......我試圖谷歌,但也許如果你能給我一些建議或推薦我一些文章這將是對我很大的幫助......

回答

0

一個典型的無限循環輪詢node.js中的某個端點將涉及在先前調用的完成處理程序中調用的setTimeout()。所以,既然你沒有提供真正的代碼,這裏是它如何工作的概述:

function makeCall(arg1, arg2, arg3) { 
    request(...., function(err, data) { 
     if (err) { 
      // error handling here 
     } else { 
      // process data here 
      // start next API call after some timeout 
      setTimeout(function() { 
       makeCall(arg1, arg2, arg3); 
      }, 5000); 
     } 
    }); 
} 
+0

謝謝!如果我以正確的方式理解這一點,那麼我將調用一些函數「請求」,將客戶端ID作爲參數(而不是您的......)並返回一些API響應,然後在else中處理它{//處理數據? –

+0

@JohnnyGreenwood - 有很多方法可以使你的API調用,但我已經在這個模塊中使用'request()'函數顯示它:https://github.com/request/request。這裏解釋了request()的參數。 – jfriend00

+0

@JohnnyGreenwood你看了我的答案嗎?我不認爲setTimeout可以幫助你。 –

1

聽起來像輪詢或長輪詢。我會把它放在一個單獨的模塊中,並提出有關新數據的事件。

我沒有測試這個代碼,所以你可能需要修復一些東西,但這是一般的想法。

// in poll.js          
var events = require('events');     
var request = require('request');     

function Checker(url) {       
    var self = this;        

    function resp(e,r,body) {      
    if (body.indexOf('new data'===0)) {   
     self.emit('newdata', {data:body.substr(10)});             
    }            
    setTimeout(function(){self.check(url, resp);}, 1000);      
    }            

    this.url = url;         

    this.check = function(url) {     
    request.get(url, resp);      
    }            

    this.check(url);  

}             

Checker.prototype.__proto__ = events.EventEmitter.prototype; 


module.exports = Checker;       

// in server.js         
var Checker = require('./poll.js');    
io.on('connection', function (socket) {   
    var checker = new Checker('http://theurl.com/'+socket.id);           
    checker.on('newdata', function(data) {   
    socket.emit('newdata', data);     
    });            
}); 
相關問題