我应该关心 "Zone.js does not support native async/await in ES2017." 吗?
should I care about "Zone.js does not support native async/await in ES2017."?
从 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
任何人都知道这是什么意思,如果这是我应该关心的事情?
我同意Andrei。它可能不会更新您的组件,尤其是当您从某个地方的 API 获取数据时。要解决此问题,您可以将 tsconfig.base.json
文件中的目标更改回 es2015
.
接受的答案是正确的,但更具体地说,根据 this longstanding issue on GitHub, if you target es2015
, your async
functions will be transpiled to use a helper function called _awaiter
, which uses a generator function 在幕后。由于上面 link 概述的技术限制,Zone.js 可以挂钩生成器函数并在其自己的微任务队列中管理其执行,但对于原生 await
声明。
最终结果是,如果你的函数在区域 A 的上下文中执行,那么你命中了一个 await
语句,当你的函数的下一行最终执行时,它将在 Root区。来自那个问题:
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'
}
我相信这也意味着允许您管理任务执行的任何区域功能(如 Angular 测试助手 fakeAsync
/ tick
/ flush
)将无法正确识别待处理的“任务”(等待 await
解决)。 (当然,这就是为什么这首先是一个问题。)
从 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
任何人都知道这是什么意思,如果这是我应该关心的事情?
我同意Andrei。它可能不会更新您的组件,尤其是当您从某个地方的 API 获取数据时。要解决此问题,您可以将 tsconfig.base.json
文件中的目标更改回 es2015
.
接受的答案是正确的,但更具体地说,根据 this longstanding issue on GitHub, if you target es2015
, your async
functions will be transpiled to use a helper function called _awaiter
, which uses a generator function 在幕后。由于上面 link 概述的技术限制,Zone.js 可以挂钩生成器函数并在其自己的微任务队列中管理其执行,但对于原生 await
声明。
最终结果是,如果你的函数在区域 A 的上下文中执行,那么你命中了一个 await
语句,当你的函数的下一行最终执行时,它将在 Root区。来自那个问题:
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'
}
我相信这也意味着允许您管理任务执行的任何区域功能(如 Angular 测试助手 fakeAsync
/ tick
/ flush
)将无法正确识别待处理的“任务”(等待 await
解决)。 (当然,这就是为什么这首先是一个问题。)