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