2017-11-13 6 views
0

Frage zum asynchronsousity sendenNodeJS Asynchron-Bibliothek Anfragen nicht asynchronsly

Ich habe 2 Knoten geschrieben Express-Server sowohl auf localhost läuft.

Server1 hat eine einfache Express REST-API, die GET-Anfragen vom Browser empfängt, diese API wird eine GET-Anforderung an Server2 auslösen, während die Anfrage (von Server1 gesendet) innerhalb eines NodeJS async Bibliotheksaufruf gewickelt ist. Server2 antwortet für jede Anfrage nach 10 Sekunden (mit dem guten alten Knoten setTimeout).

Mein Denken war, dass - Wenn zwei Anfragen Server1-Server2 (eine Sekunde nach dem anderen) gesendet, was wäre passiert ist:

  1. Server1 wird die erste Anforderung an Server2 senden und nicht warten als Antwort, um die Ereignisschleife verfügbar zu machen, um mehr eingehende Anfragen zu hören.

  2. Nach 1 Sekunde kommt die zweite Anfrage und Server1 wird diese auch auf Server2 schießen.

  3. Server2 zählen 10 Sekunden für jede eingehende Anfrage, die schließlich auch mit ~ 1 Sekunde Verzögerung zwischen den Antworten auf Server1 reagieren wird.

  4. Server1 reagiert schließlich auf beide Anfrage nach ~ 11 Sekunden (Antworten auf Browser).

ABER NICHT !!!

Was ich erhalte, ist:

Die Antwort auf Browser für die erste Anforderung wird nach 10 Sekunden empfangen.
Die Antwort auf den Browser für die zweite Anforderung wird nach weiteren 10 Sekunden empfangen, gezählt von der ersten Antwort (insgesamt ~ 20 Sekunden), als ob überhaupt kein Async-Mechanismus funktioniert.

(Und übrigens habe ich versucht, die Anfrage zu wickeln, die Server1 sendet mit async.asyncify (...), async.series (...), async.parallel (...) - 2. Anfrage kommt immer zurück nach ~ 20 Sekunden).

Warum?

Mein severs Code:

Server 1: bekommt beide Anfragen an localhost: 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)); 

Server 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)); 

Antwort

1

es nicht ausdrücken oder Asynchron-Problem. Es ist ein Browserproblem.

Wenn Sie den gleichen Code versuchen, aber parallele Anfragen in verschiedenen Browsern ausführen, erhalten Sie, was Sie erwarten.

Für Google Chrome mehr Details finden Sie hier.

Chrome stalls when making multiple requests to same resource?

Hoffnung, das hilft.

+0

Richtig, versuchte es auf verschiedenen Browsern und es funktioniert in der Tat. Auch die Referenz, die Sie anhängen, ist sehr gut, danke! – Mercury

+0

Kein Problem. Froh, dass ich Helfen kann. –

Verwandte Themen