Saya cuba memahami cara async/menunggu berfungsi dengan 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 { }
Dari apa yang saya faham, await sepatutnya menyekat, dan dalam kod di atas nampaknya menghalangtimestamp返回对象blprimitif daripada digunakan. Fungsi saya kemudian mengembalikan nilai asal, tetapi pembolehubah masa ditetapkan kepada janji yang belum selesai dan bukannya nilai asal itu. Apa yang saya terlepas?
Awalan tak segerak ialah pembalut untuk Janji.
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; }Sama seperti
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) }) }async函数始终返回一个 Promise。这就是它报告异步工作完成情况的方式。如果您在另一个async函数中使用它,则可以使用await来等待其promise解决,但在非asyncfungsi (biasanya di peringkat atas atau dalam pengendali acara), anda mesti menggunakan Promise secara langsung, contohnya:latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });...Namun, jika anda melakukan ini pada tahap teratas modul JavaScript, semua persekitaran moden kini menyokongTahap atas dalam modul
await:(Perhatikan bahawa jika Janji ini ditolak, modul anda akan gagal dimuatkan. Jika modul anda berfungsi dengan bermakna walaupun Janji gagal, pastikan anda membungkusnya
try/catch 中untuk menangani penolakan janji.)Iamungkin(atau mungkin tidak) mendedahkan sesuatu dalam bentuk istilah panggil balik janji yang jelas, memberi kami gambaran tentang cara enjin JavaScript mengendalikan fungsi
asyncanda di bawah hud: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); }); }Beberapa nota penting:
new Promise的函数(promise 执行器函数)由new Promisepanggilan segerak.web3.eth.getBlockuntuk mula bekerja.new Promiseditangkap dan ditukar menjadi penolakan Janji.thenralat yang kami lalui) akan ditangkap dan ditukar menjadi penolakan.