2017-11-13 20 views
0

非同期に関する質問NodeJS非同期ライブラリは非同期に要求を送信しません

私は2つのノードエクスプレスサーバーを両方ともlocalhostで実行しています。 (Server1から送られた)要求がNodeJS非同期ライブラリ呼び出し内にラップされている間

Server1は、ブラウザからの要求をGET受け、簡単な特急REST APIを持って、このAPIは、Server2にGETリクエストをトリガーします。 Server2は、10秒後に各要求に対して応答します(古いノードのsetTimeoutを使用)。

  1. Server1Server2に最初の要求を送信し、待機しません:2つの要求がServer2Server1から送信された場合(他の1秒後)何が起こったでしょうです -

    私の考えははということでした応答のために、より多くの着信要求を聞くためにイベントループを利用可能にする。

  2. 1秒後に2回目のリクエストが来て、Server1Server2に送信されます。

  3. Server2は、到着する要求ごとに10秒をカウントします。応答は最終的にはServer1への応答の間に1秒の遅延で応答します。

  4. Server1は最終的に〜11秒後にリクエストに応答します(ブラウザへの応答)。

BUT NOT !!!私は何を得る

は次のとおりです。第一の要求のためのブラウザに

応答は10秒後に受信されます。
2番目の要求に対するブラウザへの応答は、非同期メカニズムがまったく動作していないかのように、最初の応答から数えて10秒後に受信されます(合計20秒になります)。

(そして、Server1がasync.asyncify(...)、async.series(...)、async.parallel(...)で送信するリクエストをラップしようとしました。 20秒後に戻る)。

なぜですか?

マイ切断コード:

サーバー1:ローカルホストに両方の要求を取得します:9999/WORK1

/* ############################################ 
       SERVER 1 
############################################ */ 
const express = require('express'); 
const app = express(); 
const async = require('async'); 
const request = require('request'); 

var reqId = 1; 

function requestWork(cb) {  
    console.log("Starting request: " + reqId); 
    request.get('http://localhost:8888/work2').on('response', cb); 
    console.log("After request: " + reqId); 
} 

app.get('/work1', (req, res) => { 

    reqId++; 
    async.setImmediate(requestWork, function() { 
     console.log("Request done!"); 
     res.send('Easy request done: ' + reqId); 
    }); 
}); 

var port = 9999; 
app.listen(port,() => console.log('Server 1, listening on port ' + port)); 

サーバー2:

/* ############################################ 
       SERVER 2 
############################################ */ 
const express = require('express'); 
const app = express(); 
const async = require('async'); 

var reqId = 100; 

app.get('/work2', (req, res) => { 

    console.log("Got work to do: " + reqId); 
    setTimeout(() => { 
     reqId++;  
     res.send('Big work done: ' + reqId) ;  
    }, 10000); 
}); 

var port = 8888; 
app.listen(port,() => console.log('Server 2, listening on port '+ port)); 

答えて

1

それが問題を表現するか、非同期ではないです。それはブラウザの問題です。

異なるブラウザで同じコードを試しても並列要求を実行すると、期待通りの結果が得られます。

Google Chromeについて詳しくはこちらをご覧ください。

Chrome stalls when making multiple requests to same resource?

は、この情報がお役に立てば幸いです。

+0

違うブラウザで試してみましたが、実際に動作します。あなたが添付した参照も非常に良いです、ありがとう! – Mercury

+0

問題ありません。喜んで助けてください。 –

関連する問題