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:
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!