Menghadapi isu gelung tak terhingga apabila menanyakan data pengguna yang mengandungi tatasusunan dalam Firebase melalui onAuthStateChanged
P粉253518620
2023-08-18 15:16:51
<p>Persekitaran semasa saya ialah ReactJS 18.2.0, berjalan dengan Firebase 10. </p>
<p>Masalah yang saya hadapi pada masa ini ialah menggunakan onAuthStateChanged untuk menanyakan data tentang pengguna apabila mereka memuatkan atau log masuk ke halaman. </p>
<p>Berikut ialah contoh coretan kod untuk perkhidmatan tersuai yang mengendalikan Firebase Auth. </p>
<p>Semua tetapan adalah sebahagian daripada konteks dan semuanya useState. </p>
<pre class="brush:js;toolbar:false;">const subscribeToAuthChanges = (
handleAuthChange,
setLoadingState,
setUserRole,
setEmail,
setFirstName,
setIsActive,
setLastName,
setLocation,
setUserID
) =>
onAuthStateChanged(auth, (pengguna) => {
jika (pengguna) {
handleAuthChange(pengguna);
FirebaseFirestoreService.getUserData(user.uid).then((data) => {
setUserID(user.uid);
setUserRole(data.role);
setEmail(data.email);
setFirstName(data.firstName);
setIsActive(data.isActive);
setLastName(data.lastName);
setLocation(data.location);
});
setLoadingState(false);
} lain {
setLoadingState(false);
}
});
};
</pra>
<p>FirebaseFirestoreService.getUserData() fungsi</p>
<pre class="brush:js;toolbar:false;">const getUserData = async (id) =>
const docRef = doc(db, "pengguna", id);
const docSnap = tunggu getDoc(docRef);
jika (docSnap.exists()) {
kembalikan docSnap.data();
} lain {
kembali null;
}
};
</pra>
<p>Ini tidak sepatutnya dijalankan dalam useEffect, konteks dicipta untuk mengendalikan perkara ini.</p>
<pre class="brush:js;toolbar:false;">import React, { useState } daripada "react";
import FirebaseAuthService daripada "../Services/FirebaseAuthService";
const FirebaseAuth = React.createContext({
pengguna: null,
memuatkan: benar,
peranan: "",
e-mel: "",
Nama pertama: "",
isActive: palsu,
Nama keluarga: "",
lokasi: "",
ID pengguna: "",
});
export const FirebaseAuthProvider = ({ kanak-kanak }) => {
const [pengguna, setUser] = useState(null);
const [peranan, setRole] = useState(null);
const [e-mel, setEmail] = useState("");
const [FirstName, setFirstName] = useState("");
const [isActive, setIsActive] = useState(false);
const [lastName, setLastName] = useState("");
const [lokasi, setLocation] = useState("");
const [userID, setUserID] = useState("");
const [loading, setLoading] = useState(true);
FirebaseAuthService.subscribeToAuthChanges(
setUser,
setLoading,
setRole,
setEmail,
setFirstName,
setIsActive,
setLastName,
setLocation,
setUserID
);
kembali (
<FirebaseAuth.Provider
nilai={{
pengguna,
memuatkan,
peranan,
e-mel,
nama pertama,
nama terakhir,
adalah aktif,
lokasi,
ID Pengguna,
}}
>
{anak-anak}
</FirebaseAuth.Provider>
);
};
eksport FirebaseAuth lalai;
</pra>
<p>在这个例子中,我缺少一个查询字符串数组的设置函数,然而,以任何查询字符串数组的设置函数,然而,以任何柹说导致onAuthStateChanged()不断循环,反复向Firebase发出读取请求。</p>
<p>有没有办法读取数组而不遇到这个问题?</p>
<p>我尝试通过循环遍历数组来避免遇到这个问题,然而,以任何方式查避免遇到这个问题,然而,以任何方式查郢询复POST请求。</p>
Sebab gelung anda berjalan adalah kerana anda tidak menetapkan onAuthStateChanged() dalam kesan sampingan, sila cuba yang berikut