Maison > Questions et réponses > le corps du texte
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粉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) }) }
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 :
new Promise
的函数(promise 执行器函数)由 new Promise
synchrone.
web3.eth.getBlock
pour commencer à travailler. new Promise
détectées et converties en un rejet de promesse. then
que nous transmettons) seront détectées et converties en rejet.