Maison  >  Questions et réponses  >  le corps du texte

Les fonctions asynchrones renvoient des promesses, pas des valeurs

J'essaie de comprendre comment fonctionne async/await avec Promise.

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

D'après ce que j'ai compris, wait est censé bloquer, et dans le code ci-dessus, il semble empêcher l'utilisation de la primitive timestamp 返回对象 bl. Ma fonction renvoie ensuite la valeur d'origine, mais la variable time est définie sur la promesse en attente au lieu de cette valeur d'origine. Qu'est-ce que j'ai raté?

P粉464208937P粉464208937390 Il y a quelques jours522

répondre à tous(2)je répondrai

  • P粉099985373

    P粉0999853732023-10-20 14:57:49

    Le préfixe asynchrone est un wrapper pour 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;
    }

    Idem que

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

    répondre
    0
  • P粉002023326

    P粉0020233262023-10-20 12:58:06

    async 函数始终返回一个 Promise。这就是它报告异步工作完成情况的方式。如果您在另一个async函数中使用它,则可以使用await来等待其promise解决,但在非async fonction (généralement au niveau supérieur ou dans un gestionnaire d'événements), vous devez utiliser Promise directement, par exemple :

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

    ...Cependant, si vous faites cela au niveau supérieur d'un module JavaScript, tous les environnements modernes prennent désormais en charge Niveau supérieur dans les modules await :

    const time = await latestTime();

    (Notez que si cette promesse est rejetée, votre module ne pourra pas se charger. Si votre module fonctionne de manière significative même si la promesse échoue, assurez-vous de l'envelopper dans try/catch 中 pour gérer le rejet de la promesse.)


    Il peut (ou non) révéler quelque chose sous la forme de termes de rappel de promesse explicites, nous donnant une idée de la façon dont le moteur JavaScript gère vos async fonctions sous le capot :

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

    Quelques notes importantes :

    • Vous le transmettez à l'appel new Promise 的函数(promise 执行器函数)由 new Promisesynchrone.
      • C'est pourquoi l'opération démarre, un appel synchrone web3.eth.getBlock pour commencer à travailler.
    • Toutes les erreurs (etc.) lancées dans l'exécuteur de promesse seront new Promise détectées et converties en un rejet de promesse.
    • Toutes les erreurs générées lors du rappel Promise (telles que l'erreur then que nous transmettons) seront détectées et converties en rejet.

    répondre
    0
  • Annulerrépondre