我的应用程序存在一个问题,该问题仅在运行e2e测试(量角器)时才变得明显。为了保护自己,我通过服务有2个API调用。
发生的情况是在数据显示在屏幕上之前调用了whenStable
。我最初以为是量角器的问题,但似乎不是。
保护码:
getTestData(): Observable<boolean> {
return this.testService
.callApiA()
.pipe(
map( data => new TestStartAction({value: data })),
tap(action => this.store.dispatch(action)),
map(Boolean)
);
}
getTestData2(): Observable<boolean> {
return this.testService
.callApiB()
.pipe(
map( kase => new TestStartAction({value: data })),
tap(action => this.store.dispatch(action)),
map(Boolean)
);
}
canActivate(): Observable<boolean> {
return this.getTestData()
.pipe(
switchMap( () => this.getTestData2() )
);
}
当我运行该应用程序时,所有内容都会加载并显示正常。但是,当我运行e2e测试时,期望在显示任何数据之前就被调用为时过早(我可以看到它确实正确加载了)。似乎存在某种竞争状况(很少通过)。另外,有效负载越大,发生故障的可能性越大。
我需要进行多次调用,因为在使用下一个API之前,我需要来自第一个API的数据。
有人遇到过ngrx 4,Angular 5和量角器这样的问题吗?
任何想法或帮助将不胜感激。
答案 0 :(得分:0)
我认为您应该使用switchMap
以外的其他名称。在您的特定情况下,我认为canActivate
会像getTestData1()
或getTestData2()
一样发光。因此,您的数据将不会在完成时加载。
文档说:
但是请注意,在每个请求都需要完成的情况下,您可能要避免使用switchMap。
=> https://www.learnrxjs.io/operators/transformation/switchmap.html
concat
是您想要的。
canActivate(): Observable<boolean> {
return this.getTestData()
.pipe(concat(this.getTestData2()));
}
我在这里看到的另一个问题是getTestData()
完成时发出getTestData2()
和store.dispatch(action)
。但这仅意味着操作已触发。动作的效果和执行可能尚未完成。