Heim  >  Artikel  >  Web-Frontend  >  Wie kann Promise.all den asynchronen URL-Abruf optimieren, um die Effizienz zu steigern?

Wie kann Promise.all den asynchronen URL-Abruf optimieren, um die Effizienz zu steigern?

DDD
DDDOriginal
2024-10-28 04:36:30338Durchsuche

How can Promise.all Streamline Asynchronous URL Fetching for Enhanced Efficiency?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn