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
Mary-Kate Olsenasal
2024-12-18 15:05:13590semak imbas

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;
}

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:

  • 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!

Kenyataan:
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