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:
Server1
wird die erste Anforderung anServer2
senden und nicht warten als Antwort, um die Ereignisschleife verfügbar zu machen, um mehr eingehende Anfragen zu hören.Nach 1 Sekunde kommt die zweite Anfrage und
Server1
wird diese auch aufServer2
schießen.Server2
zählen 10 Sekunden für jede eingehende Anfrage, die schließlich auch mit ~ 1 Sekunde Verzögerung zwischen den Antworten aufServer1
reagieren wird.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));
Richtig, versuchte es auf verschiedenen Browsern und es funktioniert in der Tat. Auch die Referenz, die Sie anhängen, ist sehr gut, danke! – Mercury
Kein Problem. Froh, dass ich Helfen kann. –