Asynchroner URL-Abruf: Nutzung von Promise.all für mehr Effizienz
Das Dienstprogramm Promise.all dient als zentrales Mittel zur gleichzeitigen Ausführung einer Sequenz von asynchronen Aufgaben. Indem wir uns der Aufgabe widmen, ein Array von URLs abzurufen, wollen wir ein analoges Array erhalten, das den entsprechenden Textinhalt kapselt. Bevor wir uns mit diesem Unterfangen befassen, ist es angebracht, einen Moment über die Unzulänglichkeiten bestimmter versuchter Ansätze nachzudenken.
Der folgende Ausschnitt versucht zwar, unser Ziel zu erreichen, greift jedoch nicht weiter:
var promises = urls.map(url => fetch(url)); var texts = []; Promise.all(promises) .then(results => { results.forEach(result => result.text()).then(t => texts.push(t)) })
Erstens: Diese Implementierung ist konzeptionell fehlerhaft, da die Funktion forEach weder ein Array noch ein Versprechen zurückgibt und somit unwirksam ist. Zweitens fehlt dem Code die notwendige Verschachtelung, um die asynchrone Natur der Textextraktion angemessen zu bewältigen.
Um diese Mängel zu beheben, ist ein vielschichtiger Ansatz erforderlich. Wir beginnen mit dem Aufruf von Promise.all für das URL-Array und rufen ein Array von Versprechen ab, die die einzelnen Abrufvorgänge darstellen. Nach erfolgreichem Abschluss dieser ersten Abrufe wird ein zweiter Promise.all-Aufruf verwendet, um den Textinhalt aus den Antworttexten zu erfassen. Die gekapselten Textwerte werden dann zu einem zusammenhängenden Array zusammengefasst. Die Essenz dieses Ansatzes wird durch den folgenden Code elegant erfasst:
Promise.all(urls.map(u => fetch(u))).then(responses => Promise.all(responses.map(res => res.text())) ).then(texts => { // Proceed with texts array... })
Eine vereinfachte Variante dieser Strategie besteht darin, den Antworttext direkt während der ersten Erfüllung des Abrufversprechens zu extrahieren:
Promise.all(urls.map(url => fetch(url).then(resp => resp.text()) )).then(texts => { // Proceed with texts array... })
oder noch prägnanter mit „await:
const texts = await Promise.all(urls.map(async url => { const resp = await fetch(url); return resp.text(); }));
Das obige ist der detaillierte Inhalt vonWie kann Promise.all den asynchronen URL-Abruf optimieren, um die Effizienz zu steigern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!