Помещение вызова API (или любой другой асинхронной операции) в сагу не делает это действие синхронным, оно все еще является асинхронным. Отдельно, redux-сага на самом деле не поддерживает получение результата от действия - вы запускаете сагу с действием, поэтому, когда сага завершается, она не может вернуть результат в код, который его первоначально инициировал. (Вы можете попытаться обойти это, передав обратный вызов вместе с действием, запускающим сагу, и заставив сагу вызвать обратный вызов, но я бы не рекомендовал такой подход.)
Я бы рекомендовал реализовать этобез redux-saga
, с использованием традиционных действий создателей. Создатели действий будут возвращать обещания, которые делают асинхронные вызовы API, и разрешатся с результатом, когда они будут завершены. Это может выглядеть примерно так:
// action creator getData1, getData2, getData3
export const getData1 = () => {
return fetch(apiUrl).then(result => {
return result.json();
}).then(resultJson => {
// also fire an action to put it in the store here
// if other parts of your app need the data
return resultJson;
}).catch(err => {
console.error(err);
});
};
// react component
// assumes 1, 2, and 3 cannot be parallelized
// could also be written with .then instead of await
onSubmit = async () => {
this.setState({showLoader: true}, () => {
const result1 = await this.props.getData1();
const result2 = await this.props.getData2(result1);
const result3 = await this.props.getData3(result2);
});
}
Вы можете попросить создателей действий отправить действие в хранилище данных вместо для разрешения обещания с результатом. Но это означает, что вы должны получить новые данные через реквизиты компонента, что, вероятно, означает что-то в componentDidUpdate
, которое проверяет, отличаются ли новые реквизиты от старых реквизитов, и, если так, вызывает следующий сборщик данных. ИМО такой подход гораздо более неловкий.