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>
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 :
var myObj = new myClass(); myObj.init(function() { // inside here you can use myObj });
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(); }
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!