TypeError:您提供了一个无效的对象,其中包含一个流

时间:2017-11-20 03:42:12

标签: rxjs rxjs5 redux-observable

以下代码有效。它执行ajax请求,然后一次调用2个操作:

export const loadThingsEpic = action$ => {

  return action$.ofType(LOAD_THINGS)
    .mergeMap(({things}) => {
      const requestURL = `${AppConfig.serverUrl()}/data/things`;
      return ajax.getJSON(requestURL)).map(response => {
        return finishLoadingThings(response);
      }).map(() => {
        return sendNotification('success');
      });
    })
    .catch(e => {
      return concat(of(finishLoadingThings({ things: {} })),
                    of(sendNotification('error')));

    });   
}}

但是这段代码没有:

export const loadThingsEpic = action$ => {

  return action$.ofType(LOAD_THINGS)
    .mergeMap(({things}) => {
      const requestURL = `${AppConfig.serverUrl()}/data/things`;
      return ajax.getJSON(requestURL).switchMap(response => {
        return concat(of(finishLoadingThings(response)),
                      of(sendNotification('success')));
      });
    })
    .catch(e => {
      return concat(of(finishLoadingThings({ things: {} })),
                    of(sendNotification('error')));
    });   
}

我用switchMap替换地图,将两个动作合并在一起(如许多其他帖子所示)。如果抛出异常,它在catch中工作。我想知道代码是什么问题。我猜它是因为我似乎无法真正掌握何时使用:map,swicthMap和mergeMap。

sendNotification和finishLoadingthings返回操作对象:

export function finishLoadingThings(data: any) {
  return {
    type: FINISH_LOADING_THINGS,
    data,
  };
}

谢谢!

2 个答案:

答案 0 :(得分:1)

按原样提供的代码似乎按预期工作:https://jsbin.com/becapin/edit?js,console我没有收到"无效的对象,其中有预期的流" ajax成功或失败时出错。

您确定错误来自此代码吗?

另外,您可能会高兴地听到forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'my-placeholder'})) 支持任意数量的参数,每个参数将在另一个参数之后发出。所以不要这样:

Observable.of

你可以这样做:

.switchMap(response => {
  return concat(of(finishLoadingThings(response)),
                of(sendNotification('success')));
});

这不会导致错误,但它只是更清洁。

答案 1 :(得分:0)

我设法通过在与mergeMap相同的级别上执行switchMap来解决我的问题。像这样:

export const loadThingsEpic = action$ => {

  return action$.ofType(LOAD_THINGS)
    .mergeMap(({things}) => {
      const requestURL = `${AppConfig.serverUrl()}/data/things`;
      return ajax.getJSON(requestURL).switchMap(response => {
        return of(response);
      });
    })
    .switchMap((res) => {
       return concat(of(finishLoadingThings(res.value)),
                      of(sendNotification('success')));
    })
    .catch(e => {
      return concat(of(finishLoadingThings({ things: {} })),
                    of(sendNotification('error')));
    });   
}

还没有完全明白。