等待承诺后等待在ngZone之外

时间:2018-05-09 15:47:02

标签: angular

Angular 6,cli 6

我最近遇到了一些问题,因为订阅中没有发生更改检测 - 如果我执行了detectChanges()那么事情就会发生变化。

这让我发现http调用正在区域外运行,这令人不安。

经过一番狩猎,我已将其缩小到此代码......

我有一个基本的http服务,它使用httpClient发出请求,并为每个" api"进行了扩展。

/* base service */
import { HttpClient, HttpHeaders } from '@angular/common/http';
...
constructor(
        protected http: HttpClient
...
/* construct request, and call */
console.log('xxxx', url, NgZone.isInAngularZone());
return this.http.request(request)

现在在我的组件中

const [yy,xx] =等待Promise.all([   this._labelApi.find()。toPromise(),   this._workspaceApi.find()。toPromise() ]);

const z =等待this._labelApi.find()。toPromise();

其中_labelApi_workspaceApi是已扩展基本服务的类

忽略代码,真正有趣的是控制台消息

xxxx /api/Labels true
xxxx /api/Workspaces true
xxxx /api/Labels false

所以当执行第二次相同的/api/Labels来电时,这次它不在区域内......

如果我将代码更改为

    const a = await this._labelApi.find().toPromise();
    const z = await this._labelApi.find().toPromise();
    const b = await this._workspaceApi.find().toPromise();

然后控制台结果是

xxxx /api/Labels true
xxxx /api/Labels false
xxxx /api/Workspaces false

所以它看起来好像第一个http调用然后将任何其他http抛出该区域。这非常非常奇怪。

有谁知道这里会发生什么?

由于

更新#1 我很确定这与toPromise()有关。如果我将代码更改为

    this._labelApi.find().subscribe();
    this._labelApi.find().subscribe();
    this._workspaceApi.find().subscribe();

然后控制台读取

    xxxx /api/Labels true
    xxxx /api/Labels true
    xxxx /api/Workspaces true

但是,当然,它等待一个http请求,然后开始另一个更棘手的

更新#2 如果我将tsconfig中的目标从esnext更改为es5,则代码会按预期运行。

所以,如果我冒险猜测,打字稿有些不对劲 - > exnext transpiler

0 个答案:

没有答案