使用 redux-observable 处理 Apollo-client 时出错

Error handling Apollo-client with redux-observable

我正在使用 Apollo-client 和 redux-observable 进行突变,到目前为止这是我的代码:

export const languageTimeZoneEpic = (action$) => {
  return action$.ofType('PING')
    .flatMap(action => client.mutate({
      mutation: languageTimeZoneIdMutation,
      variables: { id: action.id,  defaultLanguage: action.selected_language, defaultTimeZoneId: action.selected_timeZone }
    })
      .then(store.dispatch(setLocale(action.selected_language)))
  )
    .map(result => ({
      type: 'PONG',
      payload: result
    }))
    .catch(error => ({
      type: 'PONG_ERROR'
    }));
};

我的突变工作正常,但我似乎无法让我的 catch(error) 工作。在我找到的关于此的少量文档中,它建议我在 error => 之后放置 Observable of 但随后它给了我一个错误 Observable 未定义

谢谢

更新:

如果应用程序和服务器之间的连接不起作用,它只会等待连接恢复,然后完成史诗。我希望它能够捕获并出错并停止史诗。

发现上面代码中的catch(error)没有问题。事实证明,当我尝试建立连接时,暂停服务器并没有抛出 error。必须关闭它才能引发错误。

对于那些正在寻找使用 Apollo-clientredux-observable 实现突变的好方法的人(因为有几乎没有文档),这是我用于突变的代码:

import { languageMutation } from '../mutation/languageMutation';
import { changeLanguageFulfilled, changeLanguageError } from '../actions/actions';


export const languageEpic = (action$) => {
  return action$.ofType('CHANGE_LANGUAGE')
    .mergeMap(action => client.mutate({
      mutation: languageMutation,
       variables: { id: action.id,  defaultLanguage: action.selected_language, defaultTimeZoneId: action.selected_timeZone }
    }).then(result => changeLanguageFulfilled(result))
      .catch(error => changeLanguageError(error))
  );
};

changeLanguageFulfilled 和 changeLanguageError 都是触发它们自己的 reducer 的动作。

希望这对某人有所帮助。