我应该关心“Zone.js 在 ES2017 中不支持原生 async/await”吗?

Jør*_*sen 20 zonejs angular

从 Angular 9 升级到 10 后,我在运行 ng serve 时收到这些警告:

WARNING: Zone.js does not support native async/await in ES2017.
These blocks are not intercepted by zone.js and will not triggering change detection.
See: https://github.com/angular/zone.js/pull/1140 for more information.

(node:56581) ExperimentalWarning: The fs.promises API is experimental
Run Code Online (Sandbox Code Playgroud)

有人知道这意味着什么,如果这是我应该关心的事情吗?

Luk*_*ngi 11

我同意安德烈。它可能不会更新您的组件,尤其是当您从某处的 API 获取数据时。要解决此问题,您可以将tsconfig.base.json文件中的目标更改回es2015.

  • 但这将停止动态导入工作(如果使用的话),因为它仅在 es2020 中受支持 (2认同)

Cod*_*rer 5

接受的答案是正确的,但更具体地说,根据GitHub 上这个长期存在的问题,如果您的目标是es2015,您的async函数将被转换为使用名为 的辅助函数,该函数在幕后_awaiter使用生成器函数。由于上述链接中概述的技术限制,Zone.js 可以挂钩生成器函数并在其自己的微任务队列中管理其执行,但对于本机语句不可能这样做await

最终结果是,如果您的函数在区域 A 的上下文中执行,那么您点击一条await语句,当函数的下一行最终执行时,它将在根区域中。从那个问题来看:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const test = async () => {
      console.log(Zone.current.name) // will output 'angular'
      await delay(100);
      console.log(Zone.current.name) // will output 'root'
    }
Run Code Online (Sandbox Code Playgroud)

我相信这也意味着任何允许您管理任务执行的区域功能(例如 Angular 测试助手// fakeAsync)将无法正确识别待处理的“任务”(等待解决)。(当然,这就是为什么这首先是一个问题。)tickflushawait


kai*_*kai 5

我知道这个问题早已解决,但我想在这里留下更新的答案以及它现在如何工作的解释。

对于当前的 Angular CLI 版本 (14.1.2),将默认tsconfig.json生成。es2020这意味着我们现在可以受益于最新的 ES 功能,并且更改检测不会出现警告或问题。但是,如果async/await 和 zone.js 的问题尚未解决,那么更改检测如何工作呢?我找不到任何有关它的文档,但我发现了这段代码,其中 Angular 使用babel transform-async-to-generator 插件来转换 async/await,无论设置什么 ES 目标。