2017-01-13 41 views
0

我将共享代码直接的NodeJS执行功能多发性次无延迟

app.get('/ListBooks', function (req, res) { 
console.log("Function called"); 
//internally calls another URL and sends its response to browser 
request({ 
    url: 'someURLinRESTServer', 
    method: 'POST', 
    json: MyJsonData 

}, function (error, response, body) { 
    if (error) { 
     console.log("/Call Failed ->" + error); 
     res.status(200).send('Failed'); 

    } else { 
     console.log("/Call got Response"); 
     console.log(response.statusCode, body); 
     res.send(body); res.end(); 
    } 

})

现在,当在浏览器产生http://localhost/ListBooks

我的节点控制台上的一个请求显示所述第一消息“函数称为“并等待内部REST URL响应

真正的问题只发生在RES牛逼服务器宕机

然后如果我尝试调用http://localhost/ListBooks从其他浏览器选项卡中的节点服务器控制台犯规表现出任何的改变,只有以前的功能REST调用的repsonse后把它显示在应用第二函数调用的控制台消息。得到(“/ ListBooks”

我以为节点JS使得异步功能bt后这里我硝基甲苯想要的功能等待喜欢这个多实例调用

,或只是在印刷消息的延迟和每个函数调用分别执行.Plz澄清...

+0

这不是导致序列化的Express服务器。这可能是你打电话的其余服务器。如果你可以登录网络,你会看到Express服务器获得了两个传入的响应,并发出'request()'调用,并在request()调用得到结果后立即发送响应。所以,REST服务器本身可能会出现很大的延迟,而不是Express服务器。您需要确定REST服务器是否可以实际处理多个请求,一次对它们进行序列化。 – jfriend00

+0

是仅当REST服务器关闭时才会出现问题。 (抱歉,我忘记提及这个问题。nw编辑)否则请求和响应行为事实和控制台消息发生像正常 \t 并且当REST服务器关闭该功能不会执行第二个函数调用,直到它获得第一个响应超时 – DrVishnu

回答

0

如果这仅在REST服务器关闭时发生(如您的注释所示),那么这只是您拨打request()的电话失败的函数。而且,对request()的每次单独调用都要经历它自己的尝试连接并最终超时的周期。如果两者都超时,那么你将发出request1,然后发出request2,然后一些超时时间会通过,request1将失败,然后request2会在它不久之后失败。这与express如何处理多个请求无关,并且与REST服务器调用的行为方式无关。

如果您想缩短等待响应的时间,您可以为request()设置timeout选项,但您确实需要确保不缩短它以至于只需要一个繁忙的REST服务器实际响应的一小会儿超时。

,或只是在打印消息中的延迟和每个函数调用 分别执行

每个呼叫都完全独立地起作用。这些响应没有通过node.js或Express进行序列化。序列化的出现只是因为它们都花费相同的时间量来超时失败,所以它们会一个接一个地失败。

+0

好吧可能是多数民众赞成在对,我期待输出像函数称为||称为||的函数/呼叫失败 - > TimeOut || /调用失败 - > TimeOut bt在实际上显示像函数称为|| /呼叫失败 - > TimeOut ||称为||的函数/调用失败 - > TimeOut即使我尝试了很多选项卡请求,并且在Functioncalled和timout消息之间存在延迟。所以认为它的工作顺序不是异步形式 - – DrVishnu

+0

@DVVishnu - 如果您尝试从同一浏览器到同一主机的多个选项卡请求,浏览器本身将限制同一时间内同一个域中可以有多少个正在运行的内容,以及会使最初的请求排队等候。所以,如果你打开一大堆标签页,浏览器可能会在这方面让你感到困惑。通常,多个请求来自不同浏览器中的不同用户,浏览器在请求发送时不会发生干扰。 – jfriend00