2017-11-13 20 views
0

비동기성에 관한 질문NodeJS 비동기 라이브러리가 비동기 적으로 요청을 보내지 않습니다.

2 개의 노드 고속 서버를 모두 localhost에서 실행했습니다. (Server1에서 전송) 요청이 NodeJS 비동기 라이브러리를 호출 내에서 포장되는 동안

Server1는 브라우저에서 GET 요청을받는 간단한 표현 REST API를 가지고,이 API는 Server2에 GET 요청을 트리거합니다. Server2은 10 초 후에 각 요청에 응답합니다 (좋은 이전 노드의 setTimeout 사용).

  1. Server1Server2에 첫 번째 요청을 전송하고 대기하지 않습니다 : 무엇을 무슨 일이 생긴 것 (다른 후 1 초) Server1Server2까지 전송이 요청이있는 경우 -

    내 생각는 것이 었습니다 응답을 위해 더 많은 들어오는 요청을 청취하기 위해 이벤트 루프를 사용할 수있게 만듭니다.

  2. 1 초 후에 두 번째 요청이 들어오고 Server1Server2에도이 번호를 알려줍니다.

  3. Server2은 수신 요청마다 10 초로 계산되며, 결국 Server1에 대한 응답 사이에 ~ 1 초 지연으로 응답합니다.

  4. 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)); 

답변

1

는 명시 적 또는 비동기 문제가 아니에요 모두 요청이 localhost로 가져옵니다. 브라우저 문제입니다.

다른 브라우저에서 동일한 코드를 사용하지만 병렬 요청을 실행하면 원하는 결과를 얻을 수 있습니다.

Google 크롬에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 이 도움이

Chrome stalls when making multiple requests to same resource?

희망.

+0

맞아요, 다른 브라우저에서 시도해 보면 실제로 작동합니다. 또한 첨부 된 참조는 매우 좋습니다. 감사합니다! – Mercury

+0

문제 없습니다. 기꺼이 도와주세요. –