ngrx错误:操作必须具有type属性

时间:2017-10-03 00:40:40

标签: angular ngrx

我是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({})等。

2 个答案:

答案 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,因为你应该为你的行动创建一些类。