2014-12-01 56 views
1

我寫下了等待迴應的代碼。如果在5秒後沒有得到響應,如何註冊超時回調?如何在Node.js中爲zmq請求設置超時?

var zmqRequest = zmq.socket('req'); 
zmqRequest.connect('tcp://localhost:8188'); 

zmqRequest.send(request.params.fileGuid); 
console.log('request sent ' + request.params.fileGuid); 

zmqRequest.on('message', function(msg){ // report back to the user... }); 
+0

您是否找到了答案?我試過 socket.setsockopt(zmq.ZMQ_RCVTIMEO,1000); socket.setsockopt(zmq.ZMQ_SNDTIMEO,1000); 但它似乎沒有工作。 – 2016-01-14 16:02:57

+0

@FredMériot我在下面添加了我的答案。 – Cuthbert 2016-01-14 17:12:25

回答

1

我寫了一個使用setTimeout檢查超時請求functon。這個例子使用Typescript,但應該很容易翻譯成香草javascript。

import * as zmq from 'zmq'; 

function sendZMQRequest(params:any, doneCallback:(error:any, results:any) => void):void{ 
    // init zmq socket. 
    var zmqreq = zmq.socket('req'); 
    var connectAddress = 'tcp://0.0.0.0:8200'; 
    zmqreq.connect(connectAddress); 

    // uses setTimeout later. 
    var timeout; 

    // callback for zmq response. 
    var requestCallback = (response:Buffer) => { 
     // clear the timer when a response comes back. 
     clearTimeout(timeout); 

     // parse response and add any error checking you might need. 
     if(response){ 
      var parsedResp = JSON.parse(response.toString('utf8')); 

      doneCallback(null, parsedResp); 

     } else { 
      doneCallback(new Error('Bad Response'), null); 

     } 
    }; 

    zmqreq.send(params); 

    timeout = setTimeout(() => { 
     zmqreq.close(); 
     zmqreq.removeListener('message', requestCallback); 
     doneCallback(new Error('Request Timed Out After 3 Seconds'), null); 
    }, 3000); 

    zmqreq.on('message', requestCallback); 
} 
相關問題