RxJs 和 redux-observable。当 ajax 成功或失败时追加值

RxJs and redux-observable. Append value when ajax succeed or failed

我有以下史诗:

export const changeTeamSubscriptionPlan = (braintreePlanId: string) => ({
  type: CHANGE_TEAM_SUBSCRIPTION_PLAN,
  braintreePlanId,
});

export const changeTeamSubscriptionPlanEpic = (action$: any, store: Store<ReduxState, *>) =>
  action$.ofType(CHANGE_TEAM_SUBSCRIPTION_PLAN)
    .mergeMap(({ braintreePlanId }) => {
      const state = store.getState();
      const { subscription_id } = state.payment.subscription;
      let request;
      if (subscription_id) {
        request = ajax(api.changeTeamSubscriptionPlan(subscription_id, braintreePlanId));
      } else {
        const [method] = state.payment.paymentMethods;
        request = ajax(api.createSubscription(braintreePlanId, method.token));
      }

      // I would like to emit another value ({ type: FETCH_TEAM }) no matter what happens 
      //(basically I try to invalidate the team data even if the request fails)
      return request
        .map(response => ({
          type: CHANGE_TEAM_SUBSCRIPTION_PLAN + SUCCESS,
          payload: {
            data: response.response,
            status: response.status,
          },
        }))
        .catch(error => Observable.of({
          type: CHANGE_TEAM_SUBSCRIPTION_PLAN + FAILURE,
          response: {
            data: error.xhr.response,
            status: error.xhr.status,
          },
        }));
    });

我想做的是无论 ajax 调用以 catch 结束还是调用 map 我想追加另一个值。

我运行没有想法,所以我希望得到帮助。

切换到原始运算符后,事实证明我可以做到这一点:

  return request
    .map(response => ({
      type: CHANGE_TEAM_SUBSCRIPTION_PLAN + SUCCESS,
      payload: {
        data: response.response,
        status: response.status,
      },
    }))
    .catch(error => Observable.of({
      type: CHANGE_TEAM_SUBSCRIPTION_PLAN + FAILURE,
      error: mapToError(error),
    }))
    .concat(Observable.of({ type: 'CHUJ_TYPE' }));

concat 将在 catch 块触发时附加值 even

我最初使用的是自定义运算符,虽然我会像 catch 一样工作,但会减少我的应用程序中的样板文件:

Observable.prototype.mapFailure = function catchAndMapError(ACTION_TYPE, optionalPayload = {}) {
  return Observable.create(subscriber =>
    this.subscribe(
      value => subscriber.next(value),
      (error) => {
        try {
          const action = {
            type: ACTION_TYPE + FAILURE,
            error: {
              ...mapToError(error),
              ...optionalPayload,
            },
          };
          subscriber.next(action);
        } catch (e) { // catch mappings error
          subscriber.error(e);
        }
      },
      () => subscriber.complete(),
    ),
  );
};

好像和catch不太一样.....