【发布时间】:2018-11-19 14:03:37
【问题描述】:
我正在用 React 编写 Conway 的生命游戏版本。组件的状态包含grid,描述了当前哪些单元格处于活动状态。在每个游戏循环中,都会计算新的grid,并在下一次迭代中更新状态。
我突然想到,由于setState是异步的,当用setInterval重复调用iterate函数时,我不能保证每次iterate运行时都使用当前版本的grid。
是否有替代在 React 中使用 setInterval 的替代方法来避免 setState 异步导致的任何潜在问题?
以下是描述游戏循环的相关函数:
go = () => {
const { tickInterval } = this.state;
this.timerId = setInterval(this.iterate, 570 - tickInterval);
this.setState({
running: true,
});
};
iterate = () => {
const { grid, gridSize, ticks } = this.state;
const nextGrid = getNextIteration(grid, gridSize);
this.setState({
grid: nextGrid,
ticks: ticks + 1,
});
};
【问题讨论】:
-
setState可以采用callback function,该callback function 在新状态完全传播之后执行。 -
this.timerId来自setInterval,我可以通过调用clearInterval轻松停止循环。使用回调,我猜回调函数将使用setTimeout?停止由回调函数组成的循环的方法是什么?
标签: javascript reactjs