#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 . Это должно сработать. Спасибо.