2017-01-13 58 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