预期:Root2 渲染两次。实际:Root2 渲染非确定次数。这个二分法得到 #15755 ,移除了 5000 的限制。没有它,我们得到的更新具有比 5000 稍大的超时时间,因此循环不会停止,直到我们到达 5000 。
Root2
5000
n3schb8v1#
我想以"按设计"的方式来结束这个,因为它最终是关于是否允许在另一个根上进行高优先级工作来中断这个根。
06odsfpq2#
你能解释一下为什么会导致循环吗?我不太明白。
gijlo24d3#
如果考虑这个:
function Root1() { setTimeout(() => _setX(x => x + 1), 0); return 'Hello'; }
假设还有其他工作比超时时间更长。假设我正在以低优先级渲染Root1,然后我在某个地方调用_setX,现在它的优先级变为正常优先级。正常优先级更高。因此React切换到渲染它,并丢弃它已经开始的工作。由于我们已经放弃了那个工作。当那部分完成时,我们再次尝试原始的渲染。这会向正常优先级的队列中添加另一个更新,再次中断工作。这将一直持续到我们增加过期时间,最终它开始变得比正常优先级更高。然而,随着Andrew对模型的简化,这甚至不会发生,所以它会无限期地锁定,直到我们选择一些时间进行同步。现在,在两个不同的根上,我们“可以选择”保持原始工作的进行,并继续我们离开的地方,这样它可能会意外地跨越根工作,但如果在根上同时发生了其他事情导致它被中断,或者你曾经合并了根或者我们在跨根中断时改变了什么,那么它就会非常脆弱。
_setX
3条答案
按热度按时间n3schb8v1#
我想以"按设计"的方式来结束这个,因为它最终是关于是否允许在另一个根上进行高优先级工作来中断这个根。
06odsfpq2#
你能解释一下为什么会导致循环吗?我不太明白。
gijlo24d3#
如果考虑这个:
假设还有其他工作比超时时间更长。
假设我正在以低优先级渲染Root1,然后我在某个地方调用
_setX
,现在它的优先级变为正常优先级。正常优先级更高。因此React切换到渲染它,并丢弃它已经开始的工作。由于我们已经放弃了那个工作。当那部分完成时,我们再次尝试原始的渲染。这会向正常优先级的队列中添加另一个更新,再次中断工作。这将一直持续到我们增加过期时间,最终它开始变得比正常优先级更高。然而,随着Andrew对模型的简化,这甚至不会发生,所以它会无限期地锁定,直到我们选择一些时间进行同步。现在,在两个不同的根上,我们“可以选择”保持原始工作的进行,并继续我们离开的地方,这样它可能会意外地跨越根工作,但如果在根上同时发生了其他事情导致它被中断,或者你曾经合并了根或者我们在跨根中断时改变了什么,那么它就会非常脆弱。