为什么cancelledPromise模式被认为比React中的isMounted()"antipattern"更好?

Rei*_*l-- 10 javascript reactjs

请参阅:https ://reactjs.org/blog/2015/12/16/ismounted-antipattern.html 以及此处:如何取消对componentWillUnmount的获取并在此处:ismounted antipattern,track own property

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

  • 在您的promise.resolve支票中this.IsMounted(),如果"已安装已卸载",React将为您正确返回
  • 在您的promise.resolve检查中_isMounted,您已在ComponentWillUnmount()方法中手动跟踪.
  • 使用可取消的承诺,以便您promise永远不会解决.这将解决你所有的问题并让它变得可爱.

除了,在第三种情况下你的promise遗嘱error(),但也可能error()在其他情况下(例如API已关闭).

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

所以这三个都完全相同:

处理promise结果时,请检查此变量的值,该值与组件是否已经存在直接关联unmounted.

为什么他们声称第3个选项比其他2更好,并且第1个选项是反模式.

Sam*_*Sam 9

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

在 API 调用的情况下,您可能想要忽略承诺的结果是完全合理的,因为它不再相关。使用已取消的承诺在语法和语义上将是否忽略结果的逻辑与 API 调用相关联,这可以防止未来开发人员在另一个上下文中意外使用代码并可能抑制有意义的警告的任何可能性。

尽管差异可能是语义上的,但语义本身对可维护性具有价值。在这种情况下,可取消的承诺用于在结构上并置关注点,将可能是一般问题的行为附加到正常的特定情况。

  • 我明白了……我们是说 API 调用 * 单独 * 是对 `isMounted()` 的合理使用。但是如果我们使用可取消的承诺,那么我们就可以说“现在,`isMounted()` 永远不会正确。”。对于其他情况,这更易于维护和更好地保护。 (2认同)
  • 另一个类比:GOTO(按照规范)被认为是有害的。但是“if”、“while”、“break”、“continue”和“switch”从根本上来说只是做同样的事情,但声明可以合理使用该概念的可接受情况。 (2认同)