Я использую redux-saga
, потратив некоторое время на основные концепции генераторов, генераторов с обещаниями и самой Реду-саги. Ниже я хочу понять, что идиоматично и рекомендовано, а что нет.
В одном файле я определяю свою корневую сагу, сагу-наблюдателя и одну рабочую сагу (fetchSupplierOrders
).
import {
fetchSupplierOrders,
} from './supplierOrders';
import { takeLatest} from 'redux-saga/effects';
function* watchSupplierOrdersSagas() {
yield takeLatest('REQUEST_FETCH_SUPPLIER_ORDERS', fetchSupplierOrders);
}
export default function* rootSaga() {
yield all([watchSupplierOrdersSagas()]);
}
Вот рабочая сага:
export function* fetchSupplierOrders() {
try {
const supplierOrders = yield call(getSupplierOrders); // API call is in getSupplierOrders
// normally here I would use redux-saga put to hit my redux reducers
yield supplierOrders.map(({ id }) => id)
} catch (error) {
yield put({ type: 'RECEIVE_ERROR_FETCH_SUPPLIER_ORDERS', error: error.message });
}
}
У меня есть компонент React, который, когда я нажимаю кнопку, выполняет рабочую сагу. То, что я пытаюсь сделать здесь, - это вообще не проходить через сагу «Наблюдатель за редуксой сагой». Я просто сам выполню функцию генератора в компоненте и переберу ее. Обычно я проходил через сагу-наблюдатель и вызывал рабочую сагу, которая генерировала бы побочные эффекты, изменяя состояние избыточности.
Однако, что если я хочу сделать сетевой запрос, но я не хочу сохранять результат в избыточном, а в состоянии локального компонента? Я хочу, чтобы компонент каким-то образом получил результаты из рабочей саги напрямую.
Вот обработчик щелчка для кнопки в компоненте React:
const handleFetchSuppliers = event => {
const it = fetchSupplierOrders({ payload: event.target.value });
const res1 = await it.next().value;
console.log('res1', res1);
const res2 = it.next(res1);
console.log('res2', res2);
Этот код не будет работать, потому что в рабочей саге я использую функцию redux-saga
call
. Если я уберу использование call
и вызову getSupplierOrders
(асинхронную функцию) напрямую, то ожидание сработает, и все правильные значения будут сохранены в console.logged.
Обычно это делается (выполнение рабочей саги из компонента, чтобы получить результаты запроса API)? Но если я делаю это таким образом, то теряю преимущество использования call (разве это не полезно, потому что его проще тестировать?)
До redux-saga
Я бы просто отправил Thunk, используя redux-thunk
, который в основном использует async/await
на всем протяжении.
Смешивают ли люди использование redux-thunk
и redux-saga
? Это осуждается?