#javascript #reactjs #redux #promise #redux-thunk
#javascript #reactjs #повторно #обещание #переопределение-thunk
Вопрос:
Я использую некоторый шаблон react / redux и пытаюсь найти способ отправить действие после завершения первого.
Прошло некоторое время с тех пор, как я использовал redux, поэтому я в недоумении, почему эта конфигурация для отправки действия после другого не будет работать.
В этом примере представьте, что ActionTwo () в основном точно такой же, как ActionOne (), и я просто хочу, чтобы он был запущен сразу после возврата обещания ActionOne.
Мой вопрос в том, почему в этой конфигурации возникают проблемы и каков правильный способ запуска действий сразу после завершения действий?
import axios from 'axios';
import type { ThunkAction } from '../types';
export const actionOne = (value1, value2): ThunkAction => dispatch =>
axios
.post('/api/route', {
params: {
username: value1,
password: value2
},
credentials: 'include'
})
.then(response => {
dispatch(actionTwo()); //this dispatch either fails completely or takes a long time to start
dispatch({
type: 'FETCH_ACTIONONE_SUCCESS', //this dispatch fires immediately always
data: response
});
})
.catch(err => {
dispatch({
type: 'FETCH_ACTIONONE_FAIL',
data: err
});
});
Комментарии:
1. Горячий прием: ваш ActionTwo должен отвечать за вызов второй отправки. Либо введите его напрямую, либо передайте вторую отправку в качестве обратного вызова первой.
2. Используйте asyn и ожидайте отправки
3. @SlavaKnyazev что, если вам нужно, чтобы одно действие запускалось сразу после другого без какого-либо пользовательского ввода? Можете ли вы дать ссылку на пример шаблона, который вы описываете?
4. Я предполагаю, что ActionTwo не запускает действие до тех пор, пока запрос не будет разрешен.
5. @dominic, да, вы все правильно поняли, ActionTwo выглядит точно так же, как ActionOne и даже для примера вызывает actionThree
Ответ №1:
Если вы return
выполнили обещание в actionone, вы можете дождаться его, а затем вызвать actiontwo:
export const actionOne = (value1, value2): ThunkAction => dispatch =>
return axios.post('/api/route', { // return added here
params: {
затем при отправке:
const results = await dispatch( actionone )
dispatch( actiontwo )
Ответ №2:
Вы можете обернуть свое действие один в обещание и запустить действие два, когда это обещание вернется.
Ответ №3:
Действие thunk немного отличается тем, что оно возвращает функцию, которая отправляет действия. Когда вы отправляете в thunk, он не будет немедленно вызывать / регистрировать действие, если у вас нет его там за пределами обещания запроса (см. Код ниже). Итак, первое действие, которое вы должны увидеть в вашем примере, это то, FETCH_ACTIONONE_SUCCESS
что вы не добавили FETCH_ACTIONONE_REQUESTED
действие в начало вашего thunk.
const thunkAction = () => dispatch => {
// If you have one here you will see it straight away (if it's a normal action).
dispatch({ type: 'FetchingThatThing' });
axios(...).then(data => {
// In your action this is the first action you would see once the request
// is finished since you don't have the first one ^
dispatch({ type: 'FinishedFetchingThatThing' });
});
};