【问题标题】:Javascript Asynchronous State UpdateJavascript 异步状态更新
【发布时间】:2018-04-23 22:16:06
【问题描述】:

我正在尝试考虑这个用例的最佳实践:

我有一个内部状态:results[],它将用于在渲染中显示数据。

然后,我需要并行调用 3 个 API,然后将它们合并并排序到 results[] 中,最后渲染它。

我正在使用 axios 来调用 API,但我不想使用 axios.all,因为我需要在 3 个 API 都返回时显示 results[],这样看起来会更快。

我遇到了问题,因为每次我使用 this.setState() 用新数据更新 results[] 时,后面的操作总是看到旧的 results[]; this.setState() 不会立即被应用..

最好的方法是什么?

【问题讨论】:

  • 使用this.setState((prevState) => ({ xxx: do(prevState.xxx)}));

标签: javascript reactjs asynchronous async-await axios


【解决方案1】:

由于 Javascript 在单线程上运行,因此永远不会出现竞争条件。保证在任何时候都只会运行一个异步回调,因为单个线程不能同时执行两者。下一个异步回调将安排在稍后运行。在一次函数调用中,您可以确信您是唯一处理某些数据的人。

数据可能在不同的时间进来,但如果你每次收到新数据时只是简单地合并和排序数据,那将是原子的。

【讨论】:

  • 这可能是真的,但是在 1 个请求完成后,我执行 this.setState() 并且看起来这个 setState 不会立即更新状态,因此下一个请求来了,仍然看到旧的状态..
  • 那么您可能想更详细地解释这种特定的竞争条件。
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多