非同期に関する質問NodeJS非同期ライブラリは非同期に要求を送信しません
私は2つのノードエクスプレスサーバーを両方ともlocalhostで実行しています。 (Server1
から送られた)要求がNodeJS非同期ライブラリ呼び出し内にラップされている間
Server1
は、ブラウザからの要求をGET受け、簡単な特急REST APIを持って、このAPIは、Server2
にGETリクエストをトリガーします。 Server2
は、10秒後に各要求に対して応答します(古いノードのsetTimeout
を使用)。
Server1
がServer2
に最初の要求を送信し、待機しません:2つの要求がServer2
へServer1
から送信された場合(他の1秒後)何が起こったでしょうです -私の考えははということでした応答のために、より多くの着信要求を聞くためにイベントループを利用可能にする。
1秒後に2回目のリクエストが来て、
Server1
もServer2
に送信されます。Server2
は、到着する要求ごとに10秒をカウントします。応答は最終的にはServer1
への応答の間に1秒の遅延で応答します。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));
違うブラウザで試してみましたが、実際に動作します。あなたが添付した参照も非常に良いです、ありがとう! – Mercury
問題ありません。喜んで助けてください。 –