gpt4 book ai didi

javascript - 如何克服异步useState钩子(Hook)?

转载 作者:行者123 更新时间:2023-12-02 22:17:35 24 4
gpt4 key购买 nike

useState 的异步特性导致状态无法及时到达我的函数。

   const [pushToken, setPushToken] = useState('')
const storeToken = async () => {
const token = await registerForToken()

if (token) {
try {
await AsyncStorage.setItem(NOTIFICATION_TOKEN, token)
setPushToken(token)
} catch (err) {
throw new Error(err)
}
} else {
// do something else
}
}

useEffect(() => {
if (borrowerPending) {
storeToken()
}

try {
someMutation({
variables: {
someParameter: pushToken // this pushToken is still empty
}
})
} catch (err) {
throw new Error(err)
}
}, [borrowerPending])

setPushToken(token) 仅在第二次渲染时渲染 pushToken。如何设置才能使其在第一次运行时显示?

我尝试使用 AsyncStorage.getItem(NOTIFICATION_TOKEN) 而不是 setPushToken Hook ,但结果仍然相同

更新

   const [pushToken, setPushToken] = useState('')
const storeToken = async () => {
const token = await registerForPushNotificationsAsync()

if (token) {
try {
await AsyncStorage.setItem(NOTIFICATION_TOKEN, token)
setPushToken(token)
} catch (err) {
throw new Error(err)
}
} else {
// do something else
}
}

useEffect(() => {
if (borrowerPending) {
storeToken().then(() => {
console.log("pushToken", pushToken)
try {
borrowerPendingToggle({
variables: {
borrowerPendingNotificationToken: pushToken
}
})
} catch (err) {
throw new Error(err)
}
})
}
}, [borrowerPending])

最佳答案

您需要在单独的useEffect中处理突变的发送,而不是 token 的设置:

const [pushToken, setPushToken] = useState("");

const storeToken = async () => {
const token = await registerForToken();

if (token) {
try {
await AsyncStorage.setItem(NOTIFICATION_TOKEN, token);
setPushToken(token);
} catch (err) {
throw new Error(err);
}
} else {
// do something else
}
};

// Store the token
useEffect(() => {
if (borrowerPending) {
storeToken();
}
}, [borrowerPending, storeToken]); // You should reference all dependencies in the array, not just borrowerPending.

// This runs when the value of pushToken changes, so will run once the token has been stored.
useEffect(() => {
if (pushToken) {
try {
someMutation({
variables: {
someParameter: pushToken
}
});
} catch (err) {
throw new Error(err);
}
}
}, [pushToken, someMutation]);

关于javascript - 如何克服异步useState钩子(Hook)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59340487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com