Heim > Web-Frontend > js-Tutorial > Warum geben asynchrone JavaScript-Funktionen immer Versprechen zurück, selbst wenn sie primitive Werte zurückgeben?

Warum geben asynchrone JavaScript-Funktionen immer Versprechen zurück, selbst wenn sie primitive Werte zurückgeben?

Mary-Kate Olsen
Freigeben: 2024-12-18 15:05:13
Original
579 Leute haben es durchsucht

Why Do Async JavaScript Functions Always Return Promises, Even When Returning Primitive Values?

Asynchrone Funktion, die Versprechen zurückgibt: Eine detaillierte Erklärung

In JavaScript ist das Verständnis der Interaktion zwischen asynchronen Funktionen und Versprechen von entscheidender Bedeutung. Mit JavaScript ES2017 eingeführte asynchrone Funktionen ermöglichen asynchrone Vorgänge ohne die Notwendigkeit von Rückrufen. Sie geben ein Versprechen zurück, das das letztendliche Ergebnis des asynchronen Vorgangs darstellt.

Betrachten Sie die folgende asynchrone Funktion:

async function latestTime() {
  const bl = await web3.eth.getBlock('latest');
  console.log(bl.timestamp); // Returns a primitive
  console.log(typeof bl.timestamp.then == 'function'); // Returns false - not a promise
  return bl.timestamp;
}
Nach dem Login kopieren

Die Verwirrung entsteht, wenn die Funktion „latestTime“ nicht in einer anderen asynchronen Funktion verwendet wird und wird einer Variablen außerhalb des asynchronen Kontexts zugewiesen:

const time = latestTime(); // Promise { <pending> }
Nach dem Login kopieren

Dadurch wird die Zeitvariable zu einem ausstehenden Versprechen anstelle des primitiven Werts von der asynchronen Funktion zurückgegeben. Dies liegt daran, dass asynchrone Funktionen immer ein Versprechen zurückgeben, auch wenn sie einen primitiven Wert in ihrem Körper zurückgeben.

Um mit dieser Situation richtig umzugehen, haben Sie zwei Möglichkeiten:

1. Versprechen direkt verwenden:

In nicht asynchronen Kontexten, wie z. B. Event-Handlern oder Moduloberstufen, müssen Versprechen direkt verarbeitet werden. Sie können die Methode then() verwenden:

latestTime()
  .then(time => {
    console.log(time);
  })
  .catch(error => {
    // Handle/report error
  });
Nach dem Login kopieren

2. Top-Level-Await in Modulen:

Moderne JavaScript-Umgebungen unterstützen Top-Level-Await in Modulen, sodass Sie Folgendes schreiben können:

const time = await latestTime();
Nach dem Login kopieren

Unter der Haube:

Um zu verstehen, wie die JavaScript-Engine eine asynchrone Funktion verarbeitet, betrachten Sie deren Umschreibung als explizites Versprechen Rückruf:

function latestTime() {
  return new Promise((resolve, reject) => {
    web3.eth.getBlock('latest')
      .then(bl => {
        console.log(bl.timestamp);
        console.log(typeof bl.timestamp.then == 'function');
        resolve(bl.timestamp);
      })
      .catch(reject);
  });
}
Nach dem Login kopieren

Diese explizite Promise-Syntax hebt mehrere wichtige Punkte hervor:

  • Die Promise-Executor-Funktion (an neues Promise übergeben) läuft synchron, weshalb web3.eth.getBlock wird sofort aufgerufen.
  • Fehler, die innerhalb des Promise-Executors oder seiner Rückrufe ausgelöst werden, werden abgefangen und als Promise weitergegeben Ablehnungen.

Das obige ist der detaillierte Inhalt vonWarum geben asynchrone JavaScript-Funktionen immer Versprechen zurück, selbst wenn sie primitive Werte zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage