2016-12-31 40 views
1

试图让这个NGRX @Effect与HTTP调用工作。NGRX - 动作可能没有一个未定义的“类型”属性

@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 new post.LoadSuccessAction([['one'], ['two']])

postServiceget方法很简单

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[]) { } 
} 
+0

在效果中使用'switchMap'。目前,你的效果是发出可观察的而不是行动。 – cartant

+0

bingo,将第一张地图改成switchMap就行。需要重新审视rxjs才能了解这一点。如果您可以提供一些有洞察力的答案,我会将其标记为已接受。 – Mike

回答

3

您服务的结果是可观察到的和返回,从你的镇静作用的map操作员可以看到效果发射可观察到的 - 不是一个动作。

ngrx商店询问type属性的可观察性,并且没有找到它,会影响您提到的错误。

RxJS包含几个运营商,将“扁平化”映射观测到组成的观测。而你可能想要的那个是switchMapswitchMap运算符将订阅返回的observable,并将其值发送到组合的observable的值流中。另外,如果另一个LOAD操作在挂起的服务调用完成之前发生,挂起的调用的observable将被取消订阅并被忽略 - 这可能是您想要的行为。

如果你不想挂起服务电话忽略,您可以使用concatMap

相关问题