Asynchrone Funktion, die das Versprechen anstelle des Werts zurückgibt

Lesezeit: 3 Minuten

Ich versuche zu verstehen, wie async/await in Verbindung mit Versprechungen funktioniert.

Code

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;
}
const time = latestTime(); // Promise { <pending> }

Problem

Soweit ich weiß, sollte await blockieren und im obigen Code scheint es die Rückgabe eines Objekts zu blockieren bl mit dem Primitiven timestamp. Dann gibt meine Funktion den primitiven Wert zurück, die Zeitvariable wird jedoch auf ein ausstehendes Versprechen anstelle dieses Primitivs gesetzt. Was vermisse ich?

  • das ist es, was asynchrone Funktionen tun – lesen Sie die spez

    – Jaromanda X

    14. Juli 2018 um 12:00 Uhr


  • await should be blocking nein – das Blockieren von Code in Javascript ist eine “schlechte Idee”™ und async/await hat überhaupt nichts mit Blockieren zu tun

    – Jaromanda X

    14. Juli 2018 um 12:01 Uhr

  • Jeden async function gibt ein Versprechen zurück, so dass Sie es darin können await andere Versprechungen, das ist der springende Punkt

    – Bergi

    14. Juli 2018 um 12:02 Uhr


  • Beantwortet das deine Frage? async/await gibt implizit das Versprechen zurück?

    – Ivar

    17. Juli 2021 um 21:28 Uhr

Async-Präfix ist eine Art Wrapper für Promises.

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

Ist das gleiche wie

function latestTime() {
    return new Promise(function(resolve,success){
        const bl = web3.eth.getBlock('latest');
        bl.then(function(result){
            console.log(result.timestamp); // Returns a primitive
            console.log(typeof result.timestamp.then == 'function'); //Returns false - not a promise
            resolve(result.timestamp)
        })
}

  • Vielen Dank für die beschreibende Antwort, ich habe offensichtlich den Punkt verfehlt.

    – Benutzer3223162

    14. Juli 2018 um 12:19 Uhr

  • Nur eine Randnotiz: Es gibt ein paar Probleme mit dieser Übersetzung von async Funktion. Es ist in sehr allgemeiner konzeptioneller Hinsicht in Ordnung, behandelt die Ablehnung jedoch nicht korrekt, hat einen Syntaxfehler und gibt einen sehr überraschenden Namen (success?!) auf das zweite Argument, das an den Promise Executor übergeben wird (die Funktion, die verwendet werden soll ablehnen das Versprechen)… 🙂

    – TJ Crowder

    19. August 2020 um 12:50 Uhr

Asynchrone Funktion die das Versprechen anstelle des Werts zuruckgibt
TJ Crowder

Ein async Die Funktion gibt immer ein Promise zurück. So meldet es den Abschluss seiner asynchronen Arbeit. Wenn Sie es in einem anderen verwenden async Funktion, die Sie verwenden können await zu warten, bis sich sein Versprechen erfüllt, aber in einer nichtasync Funktion (häufig auf der obersten Ebene oder in einem Event-Handler), müssen Sie das Promise direkt verwenden, z.

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

Wenn Sie dies auf der obersten Ebene eines JavaScript-Moduls tun, unterstützen einige Umgebungen jetzt das kommende Höchststufe await in Modulen:

const time = await latestTime();

JavaScript-Engines erhalten Unterstützung für Top-Level awaitund Webpack bietet experimentelle Unterstützung dafürzum Beispiel.


Hier ist eine grobe Übersetzung von Ihnen async Funktion in expliziten Versprechensbedingungen:

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

Einige wichtige Hinweise dazu:

  • Die Funktion, an die Sie übergeben new Promise (der Versprechen Vollstrecker Funktion) wird synchron von aufgerufen new Promise.
    • Deshalb beginnt die Operation, web3.eth.getBlock wird synchron aufgerufen, um die Arbeit zu starten.
  • Jeder Fehler (usw.), der im Promise Executor geworfen wird, wird abgefangen new Promise und Umwandlung in eine Versprechensablehnung.
  • Jeder Fehler (usw.), der in einem Promise-Callback geworfen wird (wie der, den wir übergeben then) wird abgefangen und in eine Ablehnung umgewandelt.

async Funktion wird zurückkehren Promise ohnehin. Der Rückgabewert ist `Promise, also in Ihrem Fall:

async function latestTime(): Promise<some primitive> {
  const bl = await web3.eth.getBlock('latest');
  return bl.timestamp;
}

Also, weiter können Sie es wie folgt verwenden:

const time = await latestTime();

Aber für das Erreichen einer allgemeinen Ansicht über async/await Feature wird es besser sein, Dokumentation zu lesen.

964640cookie-checkAsynchrone Funktion, die das Versprechen anstelle des Werts zurückgibt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy