Ожидание действия внутри действия в redux

#typescript #redux

#typescript #redux

Вопрос:

Я пытаюсь повторно использовать одно из своих действий. Мои действия выглядят так:

 const actions = {
changeStage: (data: Object) => (dispatch) => {
        return new Promise((resolve) => {
            dispatch({type: ACTION_TYPES.Loader, payload: "Loading"});
            resolve();
        })
        .then(() => {
            return serviceCallToChangeStage(data); 
        })
        .catch((str: string) => {
            dispatch({type:ACTION_TYPES.error, payload: str});
        });
    }
  

Я хочу повторно использовать указанное выше действие в другом действии, которое показано ниже:

 changeStageAndSaveData: (data: Object) => (dispatch) => {
        return new Promise((resolve) => {
            dispatch({type: ACTION_TYPES.Loader, payload: "Loading"});
            resolve();
        })
        .then(() => { //This is where I want to re-use
            if(certainCondition){
                return actions.changeStage(data);
            }
        }
        .then(() => {
            return saveDataThroughServiceCall(data); 
        })
        .catch((str: string) => {
            dispatch({type:ACTION_TYPES.error, payload: str});
        });
    }
  

По какой-то причине, если я возвращаю actions.changeStage(данные), он не выполняется.
Если я выполняю отправку для этого actions.changeStage() , второй вызов servicecall выполняется сразу, не дожидаясь возврата предыдущего вызова.
Поскольку оба моих действия уже заключены в promises, я бы ожидал, что его можно будет использовать повторно с возвратом.
Чего мне не хватает?

Ответ №1:

Вы можете сделать следующее:

 const actions = {
  changeStage: (data: Object) => (dispatch) => {
    //dispatch is not async no need for the promise yet
    dispatch({
      type: ACTION_TYPES.Loader,
      payload: 'Loading',
    });
    //I assume serviceCallToChangeStage returns a promise
    return serviceCallToChangeStage(data).catch(
      (str: string) => {
        dispatch({
          type: ACTION_TYPES.error,
          payload: str,
        });
      }
    );
  },
  changeStageAndSaveData: (data: Object) => (dispatch) => {
    //no need to create a promise yet
    dispatch({
      type: ACTION_TYPES.Loader,
      payload: 'Loading',
    });
    //here you can return a promise
    return Promise.resolve(
      certainCondition amp;amp;
        actions.changeStage(data)(dispatch)
    )
      .then(() => saveDataThroughServiceCall(data))
      .catch((str: string) => {
        dispatch({
          type: ACTION_TYPES.error,
          payload: str,
        });
      });
  },
};
  

Комментарии:

1. Дело в том, что я все еще хочу, чтобы saveDataThroughServiceCall выполнялся независимо. Вызов changeStage является необязательным.

2. @Noel Да, и разве это не то, что делает этот ответ?

3. Ах. Теперь я это вижу. Определенные условия являются частью аргумента resolve . Это должно сработать. Спасибо.