javascript - React useEffect 清理函数依赖于 async await 结果

标签 javascript reactjs async-await react-hooks

我有一个 react 组件,它异步获取一些资源,然后订阅资源更改。

问题是清理函数不在这个资源的闭包中:

useEffect(() => {
  const onResourceChange = () => { 
    console.log('resource changed');
  };

  getSomeResource().then(resource => {
    resource.subscribe(onResourceChange);
  });

  return () => {
    resource.unsubscribe(onResourceChange); // Error! resource is undefined
  }
}, []);

由于在 useEffect 中使用异步函数是不允许的,在 useEffect 的清理函数中取消订阅此资源的最佳方法是什么?

最佳答案

我看到这里有两个“副作用”。

  1. 获取资源(需要发生一次,依赖[])
  2. 订阅/取消订阅回调(需要在资源更改、依赖、[resource] 时发生)

所以我

  1. 将它们分成两个“效果”(步骤,每个处理一个副作用)
  2. 并将其提取到自定义 Hook 中
    function useResource() {
        const [resource, setResource] = useState(undefined)

        const onResourceChange = () => console.log('resource changed');

        // Get the resource, initially.
        useEffect(() => {
          getSomeResource(setResource)
        }, [])

        // When the resource is retrieved (or changed),
        // the resource will subscribe and unsubscribe
        useEffect(() => {
          resource.subscribe(onResourceChange)
          return () => resource.unsubscribe(onResourceChange)
        }, [resource])
    }

    // Use it like this
    function App() {
        useResource()

        return <>your elements</>
    }

如您所见,第一个 useEffect 只负责获取“资源”,而第二个 useEffect 负责取消/订阅回调。

并查看每个useEffect中的deps列表(前者为空[]而后者依赖于[资源])

关于javascript - React useEffect 清理函数依赖于 async await 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57115559/

相关文章:

javascript - 有没有办法使颜色框对象可拖动?

javascript - JQuery 点击 1 什么都不做

node.js - axios get请求mongodb返回空数据

reactjs - 项目构建期间环境变量检查

javascript - Node.js 中的 "done"回调函数是什么?

c# - 卡在异步方法

javascript - 如何仅使用 native Promise 编写异步计数器,即具有用于异步代码的同步接口(interface)的计数器?

javascript - Puppeteer:如何在嵌套选择器中获取 img src?

javascript - 使用 append/insertAfter 类型函数移动 innerHTML,没有 jQuery

reactjs - react 推送到 heroku 并收到以下错误