#reactjs #typescript #redux #promise #async-await
#reactjs #typescript #сокращение #обещание #асинхронный -ожидание
Вопрос:
Я совсем новичок в Typescript и пытаюсь отправить два вызова API в базу данных. Второе должно выполняться только после разрешения первого. Решение должно работать с Redux-Thunk (а не с Redux Saga). Я безуспешно пробовал async / await и promises. Я не смог найти никаких полезных ответов в других сообщениях.
Первое действие
private placeOrder(addressId?: number, projectId?: number) {
this.props.dispatch(
requestAPIActions.load<RequestApiHttpPayload>('order', {
url: '/orders/place-order?addressId=' addressId 'amp;projectId=' projectId,
queryType: false,
options: {
method: 'POST',
}
})
);
}
Второе действие
private deleteGuest(id: number) {
this.props.dispatch(
requestAPIActions.load<RequestApiHttpPayload>('client', {
url: `/clients/${id}`,
queryType: false,
options: {
method: 'DELETE',
}
}));
}
Редактировать
requestAPIActions.загрузка:
declare const requestAPIActions: {
LOAD_REQUEST: string;
/**
* Redux action to dispatch the initial request to the URL and
* by using the given config.
* @alias requestAPIActions.load
* @param {String} requestId Id that describes the dispached request
* @param {Object} payload Url and Config for Axios promise
* @returns {Object} FSA<string, {}, RequestApiMeta>
*/
load<Payload>(requestId: string, payload: Payload, update?: boolean): import("flux-standard-action").FluxStandardAction<string, {}, RequestApiMeta>;
Именно здесь я начинаю терять понимание того, что именно происходит.
Комментарии:
1. Что
requestAPIActions.load
делать? В частности, это thunk, который возвращает обещание?2. Можете ли вы показать, где и как вы хотите отправлять эти действия и вызовы API?
3. @NicholasTower предполагая, что requestAPIActions . load — это блок, который возвращает обещание, которое вы могли бы выполнить еще раз:
const combined = args => (dispatch,getState) => thunk1(args)(dispatch,getState).then(()=>thunk2(args)(dispatch,getState))
Ответ №1:
Я думаю, что решением было бы отправить второе действие в then
блоке первого.
Вот пример из документации redux-thunk:
// Meet thunks.
// A thunk in this context is a function that can be dispatched to perform async
// activity and can dispatch actions and read state.
// This is an action creator that returns a thunk:
function makeASandwichWithSecretSauce(forPerson) {
// We can invert control here by returning a function - the "thunk".
// When this function is passed to `dispatch`, the thunk middleware will intercept it,
// and call it with `dispatch` and `getState` as arguments.
// This gives the thunk function the ability to run some logic, and still interact with the store.
return function(dispatch) {
return fetchSecretSauce().then(
(sauce) => dispatch(makeASandwich(forPerson, sauce)),
(error) => dispatch(apologize('The Sandwich Shop', forPerson, error)),
);
};
}
// Thunk middleware lets me dispatch thunk async actions
// as if they were actions!
store.dispatch(makeASandwichWithSecretSauce('Me'));
Ответ №2:
если оба действия являются обещанием, почему бы вам просто не выполнить
Promise.all([dispatch(action1(), dispatch(action2()])
.then(([res1,res2]) => console.log(res1,res2)