javascript - ngrx + 量角器 - 竞争条件
问题描述
我的应用程序有一个问题,只有在我运行 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 测试时,expect 在显示任何数据之前被调用得太早(我可以看到它确实加载正确)。似乎存在某种竞争条件(很少通过)。此外,有效载荷越大,失败的可能性就越大。
我需要进行多次调用,因为在使用下一个 API 之前我需要来自第一个 API 的数据。
有没有人在使用 ngrx 4、Angular 5 和量角器时遇到过这样的问题?
任何想法或帮助将不胜感激。
解决方案
我认为您应该使用除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)
了。但这仅意味着触发了操作。动作的效果和执行可能还没有完成。
推荐阅读
- r - 在 R 中使用 fasterize 来编写栅格
- css - 如何添加 CSS 重复 y 以使边框垂直
- linux - Installing SDL2 Development version on Ubuntu Linux
- c - C lexer, understanding documentation, preprocessing tokens
- google-sheets - Referencing a cell as the Value to use in an IFS statement in Google Sheets
- node.js - 在 node.js 中使用 Jest 和 Mock 测试 Sendgrid 实现
- java - org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL
- java - 在 docker 容器上运行服务时,Eureka 服务器无法发现客户端
- generics - 函数返回基接口的泛型类 - 类型不匹配
- android - android 应用新版本发布上的错误展示