Rumah > hujung hadapan web > tutorial js > Mengapa Fungsi JavaScript Async Sentiasa Mengembalikan Janji, Walaupun Apabila Mengembalikan Nilai Primitif?

Mengapa Fungsi JavaScript Async Sentiasa Mengembalikan Janji, Walaupun Apabila Mengembalikan Nilai Primitif?

Mary-Kate Olsen
Lepaskan: 2024-12-18 15:05:13
asal
634 orang telah melayarinya

Why Do Async JavaScript Functions Always Return Promises, Even When Returning Primitive Values?

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;
}
Salin selepas log masuk

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> }
Salin selepas log masuk

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
  });
Salin selepas log masuk

2. Penantian Tahap Atas dalam Modul:

Persekitaran JavaScript moden menyokong penantian peringkat teratas dalam modul, membolehkan anda menulis:

const time = await latestTime();
Salin selepas log masuk

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);
  });
}
Salin selepas log masuk

Sintaks janji eksplisit ini menyerlahkan beberapa perkara penting:

  • Fungsi pelaksana janji (diteruskan kepada Promise baharu) berjalan serentak, itulah sebabnya web3.eth.getBlock dipanggil serta-merta.
  • Ralat yang dilemparkan dalam pelaksana janji atau panggilan baliknya adalah ditangkap dan disebarkan sebagai penolakan janji.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan