Rumah > hujung hadapan web > tutorial js > Mengapa Async/Await Tidak Boleh Digunakan dalam Pembina JavaScript?

Mengapa Async/Await Tidak Boleh Digunakan dalam Pembina JavaScript?

Mary-Kate Olsen
Lepaskan: 2024-11-27 20:39:15
asal
903 orang telah melayarinya

Why Can't Async/Await Be Used in JavaScript Constructors?

Invokasi Asynchronous dalam Pembina: Usaha Yang Mustahil

Pengaturcaraan tak segerak menggunakan async/menunggu telah menjadi perkara biasa, tetapi aplikasinya dalam fungsi pembina meningkat cabaran yang menarik. Pertimbangkan coretan kod berikut:

customElements.define('e-mail', class extends HTMLElement {
  async constructor() {
    super()

    let uid = this.getAttribute('data-uid')
    let message = await grabUID(uid)

    const shadowRoot = this.attachShadow({mode: 'open'})
    shadowRoot.innerHTML = `
      <div>
Salin selepas log masuk

Malangnya, kod ini gagal dengan mesej ralat:

Pembina kelas mungkin bukan kaedah async

Sebabnya ialah fundamental: fungsi pembina bertanggungjawab untuk memulakan dan mengembalikan contoh objek. Walau bagaimanapun, kata kunci async menukar fungsi menjadi penjana janji, menyebabkan fungsi mengembalikan janji dan bukannya objek itu sendiri. Ini mewujudkan konflik yang wujud.

Menyingkap Kemustahilan

Salah tanggapan timbul daripada persamaan yang dirasakan antara async/menunggu dan janji. Walaupun async/wait menyediakan gula sintaksis untuk bekerja dengan janji, ia tidak mengubah tingkah laku asas. Janji mewakili operasi tak segerak yang sama ada menyelesaikan atau menolak untuk menghasilkan nilai.

Sebaliknya, fungsi pembina mesti mengembalikan objek yang sedang dibina. Keperluan yang tidak berubah ini tidak boleh diselaraskan dengan gelagat yang menghasilkan janji bagi fungsi async.

Strategi Penyelesaian

Untuk mengatasi had ini, pertimbangkan untuk menggunakan salah satu daripada corak reka bentuk berikut :

  1. Fungsi Permulaan (init()): Memperkenalkan fungsi permulaan untuk melaksanakan tugas tak segerak. Contoh objek hanya boleh digunakan dalam fungsi ini.
var myObj = new myClass();
myObj.init(function() {
    // inside here you can use myObj
});
Salin selepas log masuk
  1. Corak Pembina: Daripada memanggil pembina secara terus, gunakan fungsi pembina untuk mencipta objek contoh. Fungsi pembina mengembalikan janji yang diselesaikan kepada contoh objek setelah semua tugas tak segerak selesai.
myClass.build().then(function(myObj) {
    // myObj is returned by the promise, not by the constructor or builder
});

// with async/await:
async function foo () {
    var myObj = await myClass.build();
}
Salin selepas log masuk

Perhatikan bahawa walaupun contoh di atas menggunakan janji dalam corak pembina, panggilan balik juga boleh digunakan.

Pertimbangan Fungsi Statik

Adalah penting untuk ambil perhatian bahawa kata kunci ini dalam fungsi statik tidak merujuk kepada objek instantiated tetapi kepada kelas itu sendiri. Oleh itu, anda tidak boleh memanggil kaedah secara langsung dalam fungsi statik. Sebaliknya, rujuk kaedah menggunakan nama kelas atau isytiharkannya sebagai kaedah statik.

Atas ialah kandungan terperinci Mengapa Async/Await Tidak Boleh Digunakan dalam Pembina JavaScript?. 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