【问题标题】:setState inside a Promise function in a useEffect with hooks?带有钩子的useEffect中的Promise函数内的setState?
【发布时间】:2021-05-20 12:38:24
【问题描述】:

我正在尝试在 useEffect() 内的 Promise 函数内设置钩子的值,并能够将返回的承诺值存储在 fruit 钩子中,以便我可以在 @987654324 的返回函数中访问它@

这是我迄今为止尝试过的:

const MyComponent = () => {
  const [fruit, setFruit] = useState('')

  useEffect(() => {
    // my promise function that returns a string (a random fruit)
    promiseFunction()
      .then(value => setFruit(value))
  }, [])

  return <div>fruit ? fruit : Loading...</div>
}

到目前为止,我已经尝试了很多方法,但都没有奏效。

useEffect(() => {
  promiseFunction()
    .then(value => setFruit(() => value))
}, [])
useEffect(() => {
  promiseFunction()
    .then(value => setFruit((value) => { fruit = value }))
}, [])

毕竟,钩子的返回值还是空的。

没有错误消息或任何东西,我尝试使用另一个 useEffect 进行调试,它仍然在控制台中返回一个。

如何获取promise函数的返回值并将其存储在fruit变量中?

【问题讨论】:

  • 您是否确认(使用console.log 消息或调试)该承诺实际上通过非空value 实现?
  • &lt;div&gt;fruit ? fruit : Loading...&lt;/div&gt; 必须是 &lt;div&gt;{fruit ? fruit : 'Loading...'}&lt;/div&gt; 但否则第一个 sn-p 应该可以正常工作。不要忘记在你的 Promise 中添加一个 .catch() 错误处理程序。
  • @Bergi 是的,它确实返回了一个值
  • 那么应该没有问题。请提供minimal reproducible example

标签: javascript reactjs promise react-hooks


【解决方案1】:

第一个代码示例对我来说很完美。我唯一担心的是函数本身没有正确返回值。

您是否尝试过记录 promiseFunction 的返回值?编写此代码的另一种方法是使用可以在 useEffect 本身内部调用的函数,如下所示:

useEffect(() => {
  async function loadFruitData() {
    const promiseFunctionReturn = await promiseFunction()
    
    console.log(promiseFunctionReturn)

    setFruit(promiseFunctionReturn)
  }
  
  //Call the function
  loadFruitData();
}, [])

这应该可以让您更好地了解正在发生的事情,而且我还发现它更具可读性。

但是请记住,如果您在 setFruit 之后尝试 console.log() 数据,它不会向您显示更新的状态,这是因为 React 有一个队列来进行由 useState 引起的更新,这使它看起来像一个异步更新。

【讨论】:

  • 我无法真正编辑原始的 promiseFunction,因为它来自 npm 包。我的代码只是我正在尝试做的一个例子
  • 好的,我的第一个示例确实有效。我只是在 setState 之后执行了 console.log(),实际上我并不知道 React 有一个更新队列。我在哪里可以了解有关反应队列的更多信息?非常感谢。
  • 如果我没记错的话,在使用类组件时,Dan Abramov 在 github 的一个 Issue 中解释了这些更新,你可以在这里查看:github.com/facebook/react/issues/11527#issuecomment-360199710 当使用功能组件时,使用 useState, useState 调用要再次渲染的组件,使值更新,这就是为什么您不能立即将其注销的原因。我找不到它的文档,但我想你可以在这里阅读:medium.com/swlh/javascript-closures-and-react-4c0e3f705a6c
  • 我在官方文档中找到了它:reactjs.org/docs/… 它对此有一个肤浅的解释,但应该有所帮助。但基本上它是一个使组件重新渲染和更新值的闭包,并且在文档中它展示了如何在多次更新状态时避免不必要的影响!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2021-12-09
  • 2019-10-02
  • 2021-03-17
  • 2019-10-17
相关资源
最近更新 更多