비동기성에 관한 질문NodeJS 비동기 라이브러리가 비동기 적으로 요청을 보내지 않습니다.
2 개의 노드 고속 서버를 모두 localhost에서 실행했습니다. (Server1
에서 전송) 요청이 NodeJS 비동기 라이브러리를 호출 내에서 포장되는 동안
Server1
는 브라우저에서 GET 요청을받는 간단한 표현 REST API를 가지고,이 API는 Server2
에 GET 요청을 트리거합니다. Server2
은 10 초 후에 각 요청에 응답합니다 (좋은 이전 노드의 setTimeout
사용).
Server1
이Server2
에 첫 번째 요청을 전송하고 대기하지 않습니다 : 무엇을 무슨 일이 생긴 것 (다른 후 1 초)Server1
Server2
까지 전송이 요청이있는 경우 -내 생각는 것이 었습니다 응답을 위해 더 많은 들어오는 요청을 청취하기 위해 이벤트 루프를 사용할 수있게 만듭니다.
1 초 후에 두 번째 요청이 들어오고
Server1
은Server2
에도이 번호를 알려줍니다.Server2
은 수신 요청마다 10 초로 계산되며, 결국Server1
에 대한 응답 사이에 ~ 1 초 지연으로 응답합니다.Server1
은 결국 11 초 (브라우저에 대한 응답) 이후의 요청에 모두 응답합니다.
그러나 !!!
는 내가 얻을 것은 :
1 요청 브라우저에 대한 응답은 10 초 후에 수신됩니다.
두 번째 요청에 대한 브라우저에 대한 응답은 마치 비동기 메커니즘이 전혀 작동하지 않는 것처럼 첫 번째 응답으로부터 계산 된 또 다른 10 초 후 (총 20 초가됩니다)에 수신됩니다.
(그리고 Server1이 async.asyncify (...), async.series (...), async.parallel (...) - 두 번째 요청이 항상 오는 요청을 감싸려고했는데 20 초 후 다시).
왜?
내 벌인 코드 :
서버 1 : 9999/근무처
/* ############################################
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
문제 없습니다. 기꺼이 도와주세요. –