Rumah >hujung hadapan web >tutorial js >Mengapa Fungsi JavaScript Async Sentiasa Mengembalikan Janji, Walaupun Apabila Mengembalikan Nilai Primitif?
Janji Mengembalikan Fungsi Async: Penjelasan Terperinci
Dalam JavaScript, memahami interaksi antara fungsi async dan janji adalah penting. Fungsi Async, yang diperkenalkan oleh JavaScript ES2017, membenarkan operasi tak segerak tanpa memerlukan panggilan balik. Mereka memulangkan janji, yang mewakili hasil akhirnya operasi tak segerak.
Pertimbangkan fungsi tak segerak berikut:
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; }
Kekeliruan timbul apabila fungsi latestTime tidak digunakan dalam fungsi tak segerak yang lain dan ditugaskan kepada pembolehubah di luar konteks tak segerak:
const time = latestTime(); // Promise { <pending> }
Akibatnya, pembolehubah masa menjadi janji belum selesai dan bukannya nilai primitif yang dikembalikan oleh fungsi async. Ini berlaku kerana fungsi async sentiasa mengembalikan janji, walaupun ia mengembalikan nilai primitif dalam badannya.
Untuk mengendalikan situasi ini dengan betul, anda mempunyai dua pilihan:
1. Gunakan Janji Secara Terus:
Dalam konteks tidak segerak, seperti pengendali acara atau tahap teratas modul, janji mesti dikendalikan secara langsung. Anda boleh menggunakan kaedah then():
latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });
2. Penantian Tahap Atas dalam Modul:
Persekitaran JavaScript moden menyokong penantian peringkat teratas dalam modul, membolehkan anda menulis:
const time = await latestTime();
Di Bawah Hud:
Untuk memahami cara enjin JavaScript mengendalikan fungsi async, pertimbangkan penulisan semulanya sebagai janji yang jelas panggil balik:
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); }); }
Sintaks janji eksplisit ini menyerlahkan beberapa perkara penting:
Atas ialah kandungan terperinci Mengapa Fungsi JavaScript Async Sentiasa Mengembalikan Janji, Walaupun Apabila Mengembalikan Nilai Primitif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!