使用redux-observable

时间:2017-07-04 14:00:45

标签: reactjs redux-observable apollo-client

我正在使用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)工作。在我发现的少量文档中,它建议我将Observable of放在 error => 之后但是它会给我一个错误,说可观察 未定义

谢谢

更新

如果应用程序和服务器之间的连接不起作用,它只是等待连接重新启动然后完成史诗。我想它只是捕捉和错误并停止史诗。

1 个答案:

答案 0 :(得分:0)

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

对于那些正在寻找使用 Apollo-client redux-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的动作。

希望这有助于某人。