执行 Angular 应用程序时遇到 “zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten” 的错误

阅读时长 4 分钟读完

在使用 Angular 开发应用程序时,有时会遇到类似于下面这种错误:

这个区域错误通常发生在开发过程中,因为我们经常会在应用程序中使用第三方库,而这些库可能会覆盖全局的 Promise 对象。这会导致 zone.jsPromise 与全局 Promise 不兼容,从而在应用程序执行期间引发错误。

错误原因

Angular 应用程序的核心是 zone.js,它是一个 JavaScript 库,用于跟踪应用程序中的异步操作。 zone.js 可以管理异步任务的调度、错误处理等,从而提高应用程序的性能和可靠性。

在 Angular 应用程序中,zone.js 会注入它自己的 Promise 实现来替代全局的 Promise。这是因为 zone.js 需要捕获应用程序中的所有异步任务,包括通过 Promise 创建的异步任务。

如果全局的 Promise 被覆盖,那么 zone.jsPromise 将失去作用,从而导致错误的发生。

解决方案

要解决这个错误,我们需要确保在应用程序中使用的所有第三方库都不会覆盖全局的 Promise 对象。可以通过以下几种方法来实现:

方法1:使用 import 而不是全局变量

在构建应用程序时,为了避免全局变量被覆盖,我们应该使用 import 语句来引入第三方库。

例如,如果我们要使用 rxjs 库中的 Observable 类,我们应该这样引入:

而不是这样:

方法2:使用 noGlobalPromise 选项

tsconfig.json 文件中配置 noGlobalPromise 选项可以确保 TypeScript 不会使用全局 Promise。这可以防止全局 Promise 被覆盖。

方法3:手动重置全局 Promise

如果您必须在应用程序中使用覆盖全局 Promise 的库,那么您必须手动重置全局 Promise。您可以在应用程序的 main.ts 文件中添加以下代码:

-- -------------------- ---- -------
------ - -------------- - ---- ----------------
------ - ---------------------- - ---- ------------------------------------

-------- -------------- -
  -- ---- ------- -----
  -- ------------------------------- --- ------------------ -
    ------------------------------ -------------------
  -
-

---------------

------------------------
  ---------------------------
  ---------- -- --------------------

这个函数将检查全局 Promise 是否已经被覆盖,并将 Promise 对象的原型重置为 Promise.prototype

总结

当应用程序在执行过程中遇到 zone.js has detected that ZoneAwarePromise (window|global).Promise has been overwritten. 错误时,代表全局 Promise 已经被覆盖。为了解决这个错误,我们必须确保在应用程序中使用的所有第三方库都不会在全局范围内覆盖 Promise 对象,或者使用方法3手动重置全局 Promise,以便应用程序和 zone.js 可以正确地管理异步任务。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647869cf968c7c53b04a9eef

纠错
反馈