Ich muss mehrere API-Aufrufe durchführen, die über eine API abgerufen, Daten über die API in die Datenbank geschrieben und die Ausgabe über eine andere API an das Front-End gesendet werden.
Ich habe eine asynchrone Funktion mit Warten wie unten geschrieben -
Die ersten beiden sollten nacheinander ausgeführt werden, die dritte kann jedoch unabhängig voneinander ausgeführt werden, ohne dass Sie warten müssen, bis die ersten beiden Abrufanweisungen abgeschlossen sind.
let getToken= await fetch(url_for_getToken);
let getTokenData = await getToken.json();
let writeToDB = await fetch(url_for_writeToDB);
let writeToDBData = await writeToDB.json();
let frontEnd = await fetch(url_for_frontEnd);
let frontEndData = await frontEnd.json();
Was ist der beste Weg, um mit solchen Mehrfachabrufanweisungen umzugehen?
javascript
async-await
fetch
Yasar Abdullah
quelle
quelle
Promise.all
, aber in diesem Fall würde ich mir vorstellen, dass es sauberer (und in Zukunft einfacher zu bauen) wäre, wenn er alles in einemPromise.all
Aufruf zusammenfassen würde, speziell für die Fehlerbehandlung.Promise.all
für die ordnungsgemäße Fehlerbehandlung und das Warten auf die Erfüllung des ersten, zweiten und dritten Versprechens unerlässlich ist .Antworten:
Es gibt viele Möglichkeiten, aber die universellste besteht darin, jeden asynchronen Codepfad in eine asynchrone Funktion zu verpacken. Dies gibt Ihnen die Flexibilität, asynchrone Rückgabewerte nach Belieben zu mischen und abzugleichen. In Ihrem Beispiel können Sie sogar Code mit asynchronem iife einbinden:
quelle
Sie können verwenden
.then()
, anstatt zu warten:quelle
Promise.all
sie und senden Sie sie an den Anrufer zurück.Es ist einfacher, mit vielversprechenden "Schöpfern" (= Funktion, die Versprechen zurückgibt) zu arbeiten, als mit rohen Versprechen. Definieren Sie zunächst:
was einen solchen "Schöpfer" zurückgibt. Hier sind zwei Dienstprogramme für die serielle und parallele Verkettung, die sowohl rohe Versprechen als auch "Schöpfer" akzeptieren:
Dann kann der Hauptcode folgendermaßen geschrieben werden:
Wenn Ihnen der dedizierte "Creator" -Wrapper nicht gefällt, können Sie ihn
fetchJson
normal definierenund verwenden Sie Inline-Fortsetzungen genau dort, wo
series
oderparallel
aufgerufen werden:Um die Idee weiter voranzutreiben, können wir auch "Schöpfer" machen
series
undparallel
zurückgeben, anstatt Versprechen. Auf diese Weise können wir beliebig verschachtelte "Schaltkreise" aus seriellen und parallelen Versprechungen erstellen und die Ergebnisse in der richtigen Reihenfolge erhalten. Vollständiges Arbeitsbeispiel:quelle
fetchJson
? Ich sehe keine Vorteile darin, ein Versprechen mit einer anderen Funktion zu versehen. Die Nützlichkeit vonseries
ist fraglich, da die nächste Funktion in einer Reihe typischerweise den Rückgabewert der vorherigen Funktion (en) erfordert.series(promiseA, promiseB)
beginnen alsoA
undB
gleichzeitig.series
. Ich würde lieber async iife für Sequenzen undPromise.allSettled
stattdessen bevorzugenparallel
.Führen Sie
writeToDB
zu Beginn und ohne unabhängige Anfrage ( ) ausawait
quelle
await
Die Fehlerbehandlung ist integriert. Wenn das Versprechenasync function
abgelehnt wird , erhalten Sie eine Ausnahme. Das vom Anruf zurückgegebene Versprechen wird abgelehnt und der Anrufer wird es bemerken. Wenn Sie vorschlagen, dasawait
Schlüsselwort zu löschen und die Versprechenskette unabhängig auszuführen, dürfen Sie dies nicht tun, ohne über die Fehlerbehandlung nachzudenken. Eine Antwort, die es zumindest nicht erwähnt (oder das ursprüngliche Verhalten des Anrufers beibehält, der eine Ablehnung erhält), ist eine schlechte Antwort.