NGRX - 操作不能有未定义的 "type" 属性
NGRX - Actions may not have an undefined "type" property
试图让这个 ngrx @Effect
与 http 调用一起工作。
@Effect()
loadPosts$ = this.actions$
.ofType(post.ActionTypes.LOAD)
.map(() => {
return this.postService.get()
.map(posts => {
return new post.LoadSuccessAction(posts)})
.catch(() => of(new post.LoadSuccessAction([])));
})
如果我换入以下简单的 return 就可以了
return new post.LoadSuccessAction([['one'], ['two']])
我的postService
get
方法很简单
get() {
return this.http.get(`{this.API_PATH}/api/v1/en/posts?limit=10&offset=0`)
.map(res => res.json());
}
不太确定是什么原因造成的,也不知道去哪里找。
编辑
LoadSuccessAction
看起来像这样
export class LoadSuccessAction implements Action {
type = ActionTypes.LOAD_SUCCESS;
constructor(public payload: any[]) { }
}
您的服务结果是一个可观察对象,并且从组合效果中的 map
运算符返回结果会看到该效果发出一个可观察对象 - 而不是一个动作。
ngrx 存储询问 type
属性 的可观察对象,但没有找到,导致您提到的错误。
RxJS 包含多个运算符,它们将 'flatten' 将可观察对象映射到组合可观察对象中。您可能想要的是 switchMap
。 switchMap
运算符将订阅返回的可观察对象并将其值发送到组合可观察对象的值流中。此外,如果另一个 LOAD
操作在挂起的服务调用完成之前发生,挂起的调用的可观察对象将被取消订阅并被忽略——这可能是您想要的行为。
如果您不想忽略挂起的服务调用,您可以使用 concatMap
.
试图让这个 ngrx @Effect
与 http 调用一起工作。
@Effect()
loadPosts$ = this.actions$
.ofType(post.ActionTypes.LOAD)
.map(() => {
return this.postService.get()
.map(posts => {
return new post.LoadSuccessAction(posts)})
.catch(() => of(new post.LoadSuccessAction([])));
})
如果我换入以下简单的 return 就可以了
return new post.LoadSuccessAction([['one'], ['two']])
我的postService
get
方法很简单
get() {
return this.http.get(`{this.API_PATH}/api/v1/en/posts?limit=10&offset=0`)
.map(res => res.json());
}
不太确定是什么原因造成的,也不知道去哪里找。
编辑
LoadSuccessAction
看起来像这样
export class LoadSuccessAction implements Action {
type = ActionTypes.LOAD_SUCCESS;
constructor(public payload: any[]) { }
}
您的服务结果是一个可观察对象,并且从组合效果中的 map
运算符返回结果会看到该效果发出一个可观察对象 - 而不是一个动作。
ngrx 存储询问 type
属性 的可观察对象,但没有找到,导致您提到的错误。
RxJS 包含多个运算符,它们将 'flatten' 将可观察对象映射到组合可观察对象中。您可能想要的是 switchMap
。 switchMap
运算符将订阅返回的可观察对象并将其值发送到组合可观察对象的值流中。此外,如果另一个 LOAD
操作在挂起的服务调用完成之前发生,挂起的调用的可观察对象将被取消订阅并被忽略——这可能是您想要的行为。
如果您不想忽略挂起的服务调用,您可以使用 concatMap
.