为什么 React 中没有异步 getState 函数?
文档告诉我们 setState 是异步的。很好,但这意味着我们不能安全地使用 this.state并且我们还需要一个异步 getState 来尊重执行顺序。
据我了解,我们永远不应该使用 this.state 并使用这样的 getState 函数:
getState(callback) {
this.setState((prevState) => {
callback(prevState) ;
});
}
...
this.getState((curState) => {
// we now can use the current state safely
}
我的思维方式在这里遗漏了什么?为什么 React 中不存在这样的功能?
- 编辑 -
正如我的一个朋友告诉我的那样,这并不清楚,因为我不相信但第一个答案,让我们分析一些代码:
simpleFunc() {
setState({ "counter" : 1 });
setState({ "counter" : 2 });
this.state.counter // => no garanty about the value
getState((curState) => { // ensure curState.counter is 2 });
}
这个简单的例子表明我们不能在所有情况下都直接使用 this.state,因为 setState 是异步的。
这是一个可以使用 getState 的反例: http ://codepen.io/Epithor/pen/ZLavWR?editors=0010#0
简短的回答:不好的做法,甚至不确定 getState 给我们当前
解决方法很简单,但是我们可以分解一些函数并在不关心上下文的情况下使用它们这一事实似乎很有趣,不是吗?
因此,当许多事件以特定顺序发生时,有些事件会更改状态,有些会读取状态:您如何确定,当事件读取状态时使用this.state读取良好状态,因为所有更改都是异步的?
事实上,一切都是关于时间的:
T : event 1, change state
T+1ms : event 2, change state
T+2ms : event 3, read state
T+3ms : event 4, change state
由于您无法预测事件 1 或 2 的 setState 究竟何时会发生,您如何保证事件 3 将真正读取事件 2 中设置的状态?
简短的回答:事件在 JS 堆栈中排队,而状态更改在内部 React 队列中排队。在伸出手之前,内部 React 队列已完全取消堆叠。