2016-12-31 25 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

相關問題