Ngrx效果:无法从商店或服务获取实体

时间:2019-06-05 17:26:48

标签: angular ngrx

我正在使用ngrx(商店,效果,实体,storedevtools)开发一个angular 8应用程序。我也在发现ngrx。 我遵循了官方文档中的教程,一切正常,直到我决定优化应用程序的http请求。

我想让实体店检查是否已经加载并且是否没有联系我的服务。

我用Google搜索并找到了这个示例,然后从中得到启发,但是我遇到了一个问题 https://medium.com/@haldun7/caching-http-requests-while-using-ngrx-effects-98abd50c5c78

我从控制台浏览器发出的问题是:

  

错误TypeError:“您在期望流的位置提供了'undefined'。您可以提供Observable,Promise,Array或Iterable。”

这是问题出现的结果:

  @Effect() 
  loadAllCountries$ = this.actions$.pipe(
    ofType(fromActions.CountryActionTypes.LOAD_ALL_COUNTRIES),
    withLatestFrom(this.store.pipe(select(fromReducers.selectAllCountries))),
    switchMap((list) => { // <= this guy is a [never, Country[]] object and I don't know why :(
      if (list[1].length !== 0) {

        var temp = list[1];

        return [new fromActions.LoadCountriesSuccess( {countries: temp })];
      }
      this.service.getCountries().pipe(
        map(data => new fromActions.LoadCountriesSuccess({ countries: data })))
    })
  );

这很奇怪,因为在逐步调试时,list [1]等于0,因此执行else部分应该没有问题。

这是效果最佳的非优化版本

  @Effect() 
  loadAllCountries$: Observable<Action> = this.actions$.pipe(
    ofType(fromActions.CountryActionTypes.LOAD_ALL_COUNTRIES),
    switchMap(() => 
         this.service.getCountries().pipe(
         map(data => new fromActions.LoadCountriesSuccess({ countries: data })) 
      )));

基本上我有两个问题:

  1. 有人知道我的代码错误吗?
  2. 您知道为什么withLatestFrom返回一个[never,Country []],我认为一个可观察的对象应该会更有用。

如果需要,我可以提供其他代码部分(缩减器,操作...),但是它与本示例非常接近,我也曾经学习过ngrx:https://www.concretepage.com/angular-2/ngrx/ngrx-entity-example

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您错过了返回此处

return this.service.getCountries().pipe(
        map(data => new fromActions.LoadCountriesSuccess({ countries: data }))). 

因此,您的switchMap不返回任何内容。 在这种情况下

switchMap(() => 
         this.service.getCountries().pipe(
         map(data => new fromActions.LoadCountriesSuccess({ countries: data })) 
      )))

您的代码是单行箭头功能,因此自动返回this.service.getCountries()..的结果。