简体   繁体   English

如何延迟useEffect Hook

[英]How can I delay useEffect Hook

I am using 2 useEffects on a file and the second useEffect is dependent on the first one.我在一个文件上使用了 2 个 useEffects,第二个 useEffect 依赖于第一个。

Is there a way of delaying the second useEffect until the data from the first useEffect has been gotten?有没有一种方法可以延迟第二个 useEffect 直到获得第一个 useEffect 的数据?

const params = useParams()
const [userData, setUserData] = useState({})
const [followers, setFollowers] = useState([])

useEffect(() => getUser(params.id), [])

useEffect(() => {
    getFollowers(userData?.user?._id, auth.token)
}, [])

const getUser = async (id) => {
    const res = await getUserProfile(id)

    if (res) {
      setUserData(res)
    }
}


const getFollowers = async (id, token) => {
    const res = await getUserFollowers(id, token)
    if (res) {
      setFollowers(res)
    }
}

Execute second useEffect only if first useEffect has retrieved its data:仅当第一个useEffect已检索到其数据时才执行第二个useEffect

const params = useParams()
const [userData, setUserData] = useState(null) // initialize userData as null
const [followers, setFollowers] = useState([])

useEffect(() => getUser(params.id), [])

useEffect(() => {
    // wait until userData is defined to make the second call
    if (userData)
        getFollowers(userData?.user?._id, auth.token)
}, [userData])

Make one useEffect and make it async and fetch both API functions there with await.制作一个 useEffect 并使其异步并使用 await 在那里获取两个 API 函数。 Otherwise you also have a solution to add userData in 2nd useEffect as dependency which you can add in their dependency array.否则,您还有一个解决方案,可以在第二个 useEffect 中添加 userData 作为依赖项,您可以将其添加到它们的依赖项数组中。

It looks like you want to get followers any time userData changes, so make that a dependency of the effect:看起来您想在userData更改时随时获得关注者,因此将其作为效果的依赖项:

useEffect(() => getUser(params.id), [])

useEffect(() => {
    const id = userData?.user?._id
    if (id) {
        getFollowers(id, auth.token)
    }
}, [userData?.user?._id]) // <=====

That will re-run the followers effect whenever that ID changes.每当该 ID 更改时,这将重新运行追随者效果。

Alternatively, you could combine them:或者,您可以将它们组合起来:

useEffect(() => {
    getUser(params.id), [])
    .then(userData => getFollowers(userData?.user?._id, auth.token))
    .catch(error => { /* ...handle/report error here...*/ })
}, []);

const getUser = async (id) => {
    const res = await getUserProfile(id)

    if (res) {
        setUserData(res)
    }

    return res // <==== Note returning the result as well as setting it
}

const getFollowers = async (id, token) => {
    const res = await getUserFollowers(id, token)
    if (res) {
        setFollowers(res)
    }
}

(In either case, the code should be handling rejeections from those async functions.) (无论哪种情况,代码都应该处理来自那些async函数的拒绝。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM