Apabila mendapatkan semula data daripada Firebase menggunakan fungsi once() dengan AngularJS, adalah mungkin untuk menghadapi isu di mana rujukan menjadi tidak ditentukan apabila digunakan di luar skop fungsi. Ini disebabkan oleh sifat tak segerak pengambilan data Firebase.
Dalam coretan kod yang disediakan, pernyataan console.log(userList) selepas melampirkan pendengar Firebase kembali tidak ditentukan. Ini kerana proses mendapatkan data tidak lengkap apabila pembolehubah senarai pengguna ditetapkan.
Penyelesaian:
Terdapat beberapa pendekatan untuk menyelesaikan isu ini:
Gunakan Senarai Pengguna dalam Panggilan Balik:
Akses senarai pengguna secara tak segerak dalam panggilan balik sekali() fungsi. Ini memastikan pengambilan data selesai sebelum meneruskan.
ref.once('value', function(snapshot) { users = snapshot.val(); // ... Process and log user data within the callback ... });
Kembalikan Janji:
Kembalikan janji daripada fungsi getUsers() yang menyelesaikan dengan pengguna data setelah pengambilan selesai. Ini membolehkan kod berantai yang lebih bersih.
this.getUsers = function() { var ref = firebase.database().ref('/users/'); return ref.once('value').then(function(snapshot) { // ... Process and return user data ... }).catch(function(error){ alert('error: ' + error); }); }
Gunakan Async/Await (ES2017):
Dengan ES2017, anda boleh menggunakan sintaks async/wait untuk membuat kod tak segerak lebih seperti segerak. Fungsi getUsers() hendaklah ditandakan sebagai async:
this.getUsers = async function() { var ref = firebase.database().ref('/users/'); return ref.once('value').then(function(snapshot) { // ... Process and return user data ... }).catch(function(error){ alert('error: ' + error); }); }
Kemudian, panggil fungsi getUsers() menggunakan async/wait:
async function getAndLogUsers() { const userList = await userService.getUsers(); console.log(userList); }
Memahami sifat tak segerak bagi pengambilan data Firebase adalah penting untuk mengelakkan masalah sedemikian. Pendekatan yang digariskan di atas menyediakan penyelesaian yang berkesan untuk mengakses data Firebase dengan pasti, memastikan rujukan diselenggara dengan betul.
Atas ialah kandungan terperinci Mengapa Rujukan Firebase Saya Tidak Ditakrifkan di Luar Fungsi `sekali()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!