Firebase, ditambah dengan AngularJS, membolehkan pengambilan data yang cekap, termasuk senarai pengguna. Semasa mengakses senarai pengguna dengan fungsi once() tidak menimbulkan kesukaran, mendapatkannya di luar skop fungsi itu terbukti sukar difahami. Artikel ini meneroka punca asas dan menyediakan penyelesaian yang komprehensif.
Pendapatan semula data Firebase beroperasi secara tidak segerak, menjadikan pelaksanaan kod tidak linear. Untuk menggambarkan ini, pertimbangkan coretan kod berikut:
this.getUsers = function() { var ref = firebase.database().ref('/users/'); ref.once('value').then(function(snapshot) { // User list processing console.log(users); // Output: All users }); console.log(userList); // Output: Undefined }
Setelah dilaksanakan, output senarai pengguna yang dijangkakan pada penghujungnya kekal sukar difahami, walaupun berjaya mendapatkan semula dalam blok then(). Ini timbul kerana kod dijalankan di luar susunan:
1. Gunakan Panggilan Balik
Pendekatan langsung adalah untuk mengalihkan semua kod yang bergantung kepada senarai pengguna ke dalam fungsi panggil balik. Ini menstruktur semula logik daripada "muat senarai dan kemudian cetak" kepada "cetak apabila senarai dimuatkan."
ref.once('value', function(snapshot) { // User list processing console.log(users); // Output: All users })
2. Manfaatkan Janji dan Panggilan Balik
Janji menawarkan penyelesaian yang lebih elegan, membolehkan anda mengembalikan janji daripada fungsi getUsers() anda. Ini membolehkan anda menggunakan panggil balik once() seperti sebelum ini, tetapi dengan pembalut janji tambahan:
this.getUsers = function() { return ref.once('value').then(function(snapshot) { // User list processing return users; }) ... userService.getUsers().then(function(userList) { console.log(userList); })
3. Terima Async/Await
Dengan penggunaan janji, anda boleh memanfaatkan sintaks async/wait untuk pendekatan yang kelihatan lebih segerak:
async function getAndLogUsers() { const userList = await userService.getUsers(); console.log(userList); }
Walau bagaimanapun, ia adalah penting untuk ambil perhatian bahawa fungsi getUsers() kekal sebagai fungsi tak segerak, memerlukan kod panggilan untuk mengendalikan Promise atau Future dengan sewajarnya.
Dengan menerima strategi ini, anda boleh memanfaatkan keupayaan tak segerak Firebase dengan berkesan dan mengelakkan kehilangan rujukan di luar skop fungsi once().
Atas ialah kandungan terperinci Bagaimanakah Anda Mencegah Kehilangan Rujukan Apabila Mengambil Data Secara Asynchronous dengan Firebase?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!