Ich habe eine Funktion, die einen Parameter und einen Rückruf nimmt. Es soll eine Anfrage an eine Remote-API senden und einige Informationen basierend auf dem Parameter erhalten. Wenn es die Informationen erhält, muss es an den Rückruf gesendet werden. Jetzt schlägt die Remote-API manchmal fehl. Ich brauche meine Funktion zu versuchen, bis es gelingt, es zu tun und dann den Rückruf mit den richtigen Daten aufrufen.Wie wiederhole ich Anfragen, bis man erfolgreich ist, ohne im Knoten zu blockieren?
Derzeit habe ich den folgenden Code innerhalb der Funktion, aber ich denke, dass Sachen wie während (!done
); ist kein richtiger Knotencode.
var history = {};
while (true) {
var done = false;
var retry = true;
var req = https.request(options, function(res) {
var acc = "";
res.on("data", function(msg) {
acc += msg.toString("utf-8");
});
res.on("end", function() {
done = true;
history = JSON.parse(acc);
if (history.success) {
retry = false;
}
});
});
req.end();
while (!done);
if (!retry) break;
}
callback(history);
Wie mache ich es richtig?
Ich bekomme, wie meine Schleife eine schlechte Idee ist, aber ich habe ein extrem schlechtes Gefühl über Rekursion so. Was ist, wenn es 100 Versuche braucht, um es zu bekommen? 100 Anrufe, die nach erfolgreichem Abschluss beendet werden müssen, scheinen keine gute Idee zu sein. Ich bin neu im Knoten, also bin ich wahrscheinlich falsch. –
Denken Sie daran, dass hier ein Async-Anruf in der Mitte ist. Dies ist kein rekursiver Aufruf - Sie werden den Stack nicht aufbauen.Und ja - Sie können auch einen Zähler implementieren, um "n" mal zu wiederholen, bevor Sie aufgeben. – dc5
Nun ja, aber die Funktion kann nicht einfach beenden, wenn sie einen Async-Aufruf enthält, der noch wartet, oder? Was, wenn Sie einige der lokalen Variablen geschlossen haben? Sie müssten am Leben bleiben. –