我正在使用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 }))
)));
基本上我有两个问题:
如果需要,我可以提供其他代码部分(缩减器,操作...),但是它与本示例非常接近,我也曾经学习过ngrx:https://www.concretepage.com/angular-2/ngrx/ngrx-entity-example
非常感谢您的帮助:)
答案 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()..
的结果。