我是Angular 4 / ngrx和Rx的新手,所以不太清楚我在这里做错了什么。在我的效果中,我想使用我的服务执行搜索。该方法返回一个Observable。然后我映射它以返回新的有效载荷。
这是代码:
@Effect() executeSearchEffect = this.actions.ofType(SEARCH_EXECUTE)
.map((a: SearchExecuteAction) => {
return this.searchService.doSearch(a.payload.search.searchText)
.map((r) => {
type: SEARCH_COMPLETE,
payload: a.payload // just for testing,same as input!
}));
});
在上面,doSearch返回一个Observable。我得到的错误是Actions必须有一个我在这里返回的type属性。
如果我将代码改为如下所示,它可以像魅力一样无错误地工作:
@Effect() executeSearchEffect = this.actions.ofType(SEARCH_EXECUTE)
.map((a: SearchExecuteAction) => {
return {
type: SEARCH_COMPLETE,
payload: a.payload // just for testing,same as input!
});
我在这里做错了什么,如何从服务中映射Observable以发送新动作。注意,我的动作只是接口,所以我不能做一个新的SearchCompleteAction({})等。
答案 0 :(得分:3)
假设searchService
对搜索进行http调用,.map
不等待异步调用。您应该使用.flatMap
。
@Effect() executeSearchEffect = this.actions.ofType(SEARCH_EXECUTE)
.flatMap((a: SearchExecuteAction) =>
this.searchService.doSearch(a.payload.search.searchText)
.map((r) => ({
type: SEARCH_COMPLETE,
payload: a.payload // just for testing,same as input!
})));
);
答案 1 :(得分:2)
在您的第一个代码中,您不会返回任何内容。因为(e) => { }
只是打开一个范围而没有返回一个对象。这就是你的第二个代码工作的原因。在使用数组函数时,必须编写return
以返回对象。
另外你应该考虑看看ngrx-example-app,因为你应该为你的行动创建一些类。