Rumah > Artikel > hujung hadapan web > Mengapa Rujukan Data Firebase Saya Menjadi Tidak Ditakrifkan di Luar Fungsi `sekali()`?
Mengapa Firebase Kehilangan Rujukan di luar Fungsi once()?
Firebase menyediakan API yang fleksibel dan berkuasa untuk pengurusan data. Salah satu ciri utamanya ialah keupayaan untuk membaca dan menulis data secara tidak segerak. Walau bagaimanapun, sifat tak segerak ini kadangkala boleh membawa kepada hasil yang tidak dijangka, seperti yang ditunjukkan oleh soalan ini.
Isu timbul apabila menggunakan fungsi once() untuk mendapatkan semula senarai pengguna daripada pangkalan data. Walaupun data berjaya diambil dalam panggilan balik once(), percubaan untuk mengakses data di luar panggilan balik mengakibatkan undefined. Ini kerana pelaksanaan tak segerak bagi fungsi once() mencipta skop yang merangkum data.
Untuk memahami tingkah laku ini, pertimbangkan versi ringkas kod:
ref.once('value').then(function(snapshot) { console.log("got value"); }); console.log("after attaching listener");
Yang dijangka output kod ini ialah:
before attaching listener after attaching listener got value
Walau bagaimanapun, output sebenar ialah:
before attaching listener after attaching listener got value
Ini menunjukkan bahawa pernyataan pendengar selepas melampirkan dilaksanakan sebelum pernyataan nilai got, walaupun sekali () fungsi adalah tak segerak. Ini kerana fungsi once() tidak menyekat utas utama; ia melampirkan pendengar yang menunggu data dan melaksanakan fungsi panggil balik apabila data tersedia.
Untuk menangani isu ini dan memastikan akses kepada data di luar panggilan balik, beberapa pilihan tersedia:
Menggunakan Senarai Pengguna dalam Panggilan Balik:
Alihkan kod yang perlu mengakses senarai pengguna terus ke dalam panggilan balik. Ini menghapuskan keperluan untuk memindahkan data kepada pembolehubah yang berasingan.
Mengembalikan Janji:
Ubah suai fungsi getUsers() untuk mengembalikan Janji yang diselesaikan dengan pengguna senarai. Ini membolehkan anda mengakses data dalam fungsi .then().
Menggunakan async dan menunggu:
Jika fungsi getUsers() mengembalikan Promise, anda boleh gunakan async dan tunggu kata kunci untuk menjadikan kod kelihatan lebih segerak. Pendekatan ini memerlukan skop induk ditandakan sebagai tidak segerak.
Dengan memahami sifat tak segerak Firebase dan menggunakan teknik yang sesuai, anda boleh mengelakkan kehilangan rujukan kepada data dan memastikan akses yang boleh dipercayai kepada maklumat dalam dan luar panggilan balik.
Atas ialah kandungan terperinci Mengapa Rujukan Data Firebase Saya Menjadi Tidak Ditakrifkan di Luar Fungsi `sekali()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!