ngrx +量角器-种族条件

时间:2018-08-17 15:17:47

标签: javascript angular protractor 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测试时,期望在显示任何数据之前就被调用为时过早(我可以看到它确实正确加载了)。似乎存在某种竞争状况(很少通过)。另外,有效负载越大,发生故障的可能性越大。

我需要进行多次调用,因为在使用下一个API之前,我需要来自第一个API的数据。

有人遇到过ngrx 4,Angular 5和量角器这样的问题吗?

任何想法或帮助将不胜感激。

1 个答案:

答案 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)。但这仅意味着操作已触发。动作的效果和执行可能尚未完成。