小编典典

为什么在React中认为cancelledPromise模式比isMounted()“反模式”更好?

reactjs

参见此处:https :
//reactjs.org/blog/2015/12/16/ismount-
antipattern.html
以及此处:如何取消对componentWillUnmount的提取此处:ismount反模式,跟踪自己的属性

在这两种情况下,他们都提到了3种方法:

  • 在您的promise.resolve检查中this.IsMounted(),如果`Compounted已卸载,则哪个React将为您正确返回
  • promise.resolve检查中_isMounted,您已手动跟踪ComponentWillUnmount()方法。
  • 使用可撤销的承诺,这样您promise就永远无法解决。 这将解决您所有的问题并使它变得可爱。

除了在第三种情况下,您的promisewill error(),但error()在其他情况下也可能(例如,API已关闭)。

因此,实际上,第三个选项归结为:-在promise.error检查中errorPayload.IsCancelled已在cancellablePromise对象中手动跟踪的检查,而该检查又由中的手动调用触发ComponentWillUnmount

因此,这三个几乎完全相同:

处理promise结果时,请检查此变量的值,该变量与组件是否已经直接绑定unmounted

他们为什么断言第三个选项比其他两个选项更好,而第一个选项是反模式。


阅读 298

收藏
2020-07-22

共1个答案

小编典典

这里的关键元素是 一般if (this.isMounted()) { setState(...) }的反模式。它可能导致压制有用的警告,因此应该以怀疑的态度对待它,因为在大多数情况下,它代表了掩盖实际问题的机会。这样,即使在其行为在功能上与某些其他方法相同的情况下,该其他方法也是可取的。
__

对于API调用,您完全可以忽略一个承诺的结果,因为它不再相关了,这是完全合理的。在语法上和语义上,使用已取消的承诺将是否忽略该结果的逻辑专门与API调用联系在一起,从而避免了将来的开发人员在其他情况下意外使用该代码并可能抑制有意义的警告的可能性。

尽管差异可能是语义上的,但语义本身对可维护性具有价值。在这种情况下,可撤销的承诺可以在结构上定位问题,将可能是一个问题的行为附加到可以实现的特定情况。

2020-07-22