我应该在 setState 之后或在 useEffect() 的依赖数组中立即调用 returns 承诺的函数
Should I call a function that returns a promise immediately after setState or in the dependency array of useEffect()
我的代码(似乎工作正常)如下所示:
import { SplashScreen } from "@capacitor/splash-screen";
const MyComponent = () => {
const [data, setData] = useState()
useEffect(() => {
init()
}, [])
const init = async () => {
const response = await fetch("some_api")
setData(response.data)
await SplashScreen.hide()
}
return (<div>{JSON.stringify(data)}<div>)
}
但我想知道将 await SplashScreen.hide()
函数调用移动到具有依赖项数组中的数据的 useEffect() 是否更好:
import { SplashScreen } from "@capacitor/splash-screen";
const MyComponent = () => {
const [data, setData] = useState()
useEffect(() => {
init()
}, [])
useEffect(() => {
if (data) {
await SplashScreen.hide()
}
}, [data])
const init = async () => {
const response = await fetch("some_api")
setData(response.data)
}
return (<div>{JSON.stringify(data)}<div>)
}
注:SplashScreen.hide() returns一个承诺。哪种方式更好,为什么?
看你要不要在设置数据后调用SplashScreen.hide()
。在第一种情况下,由于 setState
异步工作,因此不能保证在设置数据后调用。但是在第二种情况下,您在更新状态后显式调用 SplashScreen.hide()
。
请注意,由于您没有对 SplashScreen.hide()
返回的承诺执行任何操作,因此没有必要使用 await
.
调用它
我的代码(似乎工作正常)如下所示:
import { SplashScreen } from "@capacitor/splash-screen";
const MyComponent = () => {
const [data, setData] = useState()
useEffect(() => {
init()
}, [])
const init = async () => {
const response = await fetch("some_api")
setData(response.data)
await SplashScreen.hide()
}
return (<div>{JSON.stringify(data)}<div>)
}
但我想知道将 await SplashScreen.hide()
函数调用移动到具有依赖项数组中的数据的 useEffect() 是否更好:
import { SplashScreen } from "@capacitor/splash-screen";
const MyComponent = () => {
const [data, setData] = useState()
useEffect(() => {
init()
}, [])
useEffect(() => {
if (data) {
await SplashScreen.hide()
}
}, [data])
const init = async () => {
const response = await fetch("some_api")
setData(response.data)
}
return (<div>{JSON.stringify(data)}<div>)
}
注:SplashScreen.hide() returns一个承诺。哪种方式更好,为什么?
看你要不要在设置数据后调用SplashScreen.hide()
。在第一种情况下,由于 setState
异步工作,因此不能保证在设置数据后调用。但是在第二种情况下,您在更新状态后显式调用 SplashScreen.hide()
。
请注意,由于您没有对 SplashScreen.hide()
返回的承诺执行任何操作,因此没有必要使用 await
.