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
Mary-Kate OlsenOriginal
2024-12-18 15:05:13582Durchsuche

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;
}

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> }

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
  });

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();

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);
  });
}

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!

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