Les fonctions asynchrones renvoient des promesses, pas des valeurs
P粉464208937
P粉464208937 2023-10-19 18:54:01
0
2
475

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粉464208937
P粉464208937

répondre à tous(2)
P粉099985373

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)
        })
}
P粉002023326

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.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!