我正在使用這段代碼:
useFocusEffect(
useCallback(async () => {
const user = JSON.parse(await AsyncStorage.getItem("user"));
if (user.uid) {
const dbRef = ref(dbDatabase, "/activity/" user.uid);
onValue(query(dbRef, limitToLast(20)), (snapshot) => {
console.log(snapshot.val());
});
return () => {
off(dbRef);
};
}
}, [])
);
我收到此錯誤:
除了用于清理的函式之外,效果函式不得回傳任何內容。看起來你寫了 'useFocusEffect(async () => ...)' 或回傳了一個 Promise。相反,在你的效果中撰寫異步函式并立即呼叫它。
我試圖把所有東西都放在一個async
函式中,但是off()
沒有被呼叫。
uj5u.com熱心網友回復:
dbRef
在嵌套函式之外定義變數,async
以便您的清理回呼可以參考它,并允許在清理發生時它可能未設定。
此外,每當async
在不處理函式回傳的承諾的地方使用函式時,請確保您不允許函式拋出錯誤(回傳被拒絕的承諾),因為沒有任何東西可以處理被拒絕的承諾。
此外,由于組件可能在 期間卸載,因此當我們知道清理不會發生(因為它已經發生)時await
,您需要確保該async
函式不會繼續其邏輯,因此您可能需要一個標志(didCleanup
在下面)。
所以是這樣的:
useFocusEffect(
useCallback(() => {
let dbRef;
let didCleanup = false;
(async() => {
try {
const user = JSON.parse(await AsyncStorage.getItem("user"));
if (!didCleanup && user.uid) {
dbRef = ref(dbDatabase, "/activity/" user.uid);
onValue(query(dbRef, limitToLast(20)), (snapshot) => {
console.log(snapshot.val());
});
}
} catch (error) {
// ...handle/report the error...
}
})();
return () => {
didCleanup = true;
if (dbRef) {
off(dbRef);
}
};
}, [])
);
uj5u.com熱心網友回復:
useEffect(() => {
const myFunction = async () => {
your code
}
myFunction()
}, [])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470110.html
標籤:javascript 反应 反应式