我正在我的 react-native 應用程式中創建一個自動注銷功能(需要每天早上 9 點注銷),因此我想出了以下邏輯:
所以我正在做的是,假設我有我的父堆疊組件,在 useEffect 里面,假設應用程式剛剛打開,我將檢查我是否已lastRunTime保存async-storage,如果為真,那么我將創建一個新的 Date 物件指向今天的當前日期,然后如果上午 9:00 在這兩次之間出現,我將注銷并將 lastRunTime 設定Date.now().toString()為async-storage.
// auto-logout at 9 am everyday
useEffect(() => {
const lastRunTime = AsynStorage.getItem('lastRunTime');
if (lastRunTime) {
const justOpened = new Date();
const lastOpened = new Date(lastRunTime);
if (9 <= justOpened.getHours() && 9 >= lastOpened.getHours()) {
logout();
AsynStorage.setItem('lastRunTime', now.toString());
}
} else {
console.log('9 am not in time range');
AsynStorage.setItem('lastRunTime', new Date().toString());
}
}, []);
但它沒有給出正確的結果,console.log('9 am not in time range');即使我提供了昨天的日期和Date.now().
const lastOpened = new Date(2022, 1, 21, 18, 0); // yesterday's 6 pm
const justOpened = new Date(); // right now
// now obviously today's 9 am was in between the 2 time intervals, but still it logs: console.log('9 am not in time range');
有人可以幫我嗎?
uj5u.com熱心網友回復:
可能的解決方案
首先,澄清一下,useEffect(() => {...}, [])只在創建組件時運行一次。它可以被認為是componentDidMount舊術語的等價物。
所以,如果你想在 9 點注銷用戶,如果用戶在 8:59 打開你的應用程式并等到 9:01,他們將不會被注銷,因為useEffect在8:59. 您可以使用任何型別的時間間隔來解決此問題,并定期檢查時間是否超過 9:00。
最理想的解決方案是在后端處理此注銷功能,如果您可以控制后端,因為這樣可以確定如果后端在線并且邏輯正確,您的用戶將被注銷。
第二個最理想的解決方案是在您的應用程式中安排某種后臺任務,以確保用戶已注銷,無論您的應用程式是否打開。
第三個最理想的解決方案是使用我上面解釋過的某種間隔,但只有在應用程式打開時才有效。
您當前代碼的問題:
if (9 <= justOpened.getHours() && 9 >= lastOpened.getHours()) {
這 if 是不正確的,因為假設 lastOpened.getHours 是17(我昨天在 17:00 打開應用程式),我不會被注銷,因為9 >= 17是false. 您可以使用一些日期處理庫,例如date-fnsor moment(由于不使用普通 Date 物件而不太推薦)來簡化日期處理,檢查您的當前日期是否在今天的 9:00 之后以及您的lastRunTime日期是否在當前日期之前。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431311.html
標籤:javascript 反应 反应式
上一篇:打字稿導航導航引數錯誤
下一篇:ReactnativeWARN可能未處理的PromiseRejection(id:2):Error:[AsyncStorage]Passingnull/undefinedasvalueisnotsup
