Redux Saga - все часы требуют отправки

Я объявил следующую сагу api.

export function* watchSaveProducts() {
  yield takeLatest(ProductActionTypes.PRODUCT_SAVE_REQUEST, saveProducts);
}

export const saga = function* productSagasContainer() {
  yield all([watchGetProducts(), watchSaveProducts()]);
};

Когда я отправляю действие из контейнера, срабатывают оба саги. Но здесь я просто вызываю только getProducts. Даже если я сохраняю продукты, getProducts запускается перед сохранением продуктов.

    componentDidMount() {
    this.props.getProducts();
  }

Реквизиты отправки, как следуйте

const mapDispatchToProps = (dispatch: any) => ({
  getProducts: () => dispatch(productActions.getProducts()),
  saveProduct: (ids: number[]) => dispatch(productActions.saveProduct(ids)),
});

person Jeeva J    schedule 17.07.2019    source источник


Ответы (1)


Когда вы делаете это, вы бросаете оба метода:

export const saga = function* productSagasContainer() {
  yield all([watchGetProducts(), watchSaveProducts()]);
};

Следовательно, оба всегда будут работать.

Я объясню свою структуру, когда работаю с редукцией и сагами:

  1. Сначала создайте sagaMiddleware для подключения redux-store с sagas (извлеченный из документация redux-saga):
import createSagaMiddleware from 'redux-saga'
import reducer from './path/to/reducer'

export default function configureStore(initialState) {
  // Note: passing middleware as the last argument to createStore requires redux@>=3.1.0
  const sagaMiddleware = createSagaMiddleware()
  return {
    ...createStore(reducer, initialState, applyMiddleware(/* other middleware, */sagaMiddleware)),
    runSaga: sagaMiddleware.run(rootSaga)
  }
}
  1. Определите rootSaga с сагами, разделенными на части приложения:
export function* rootSaga() {
  yield all([fork(sample1Watcher), fork(sample2Watcher)]);
}
  1. Создайте набор саг, который будет запускаться в этой части в зависимости от отправленного действия
export function* sample1Watcher() {
  yield takeLatest(ProductActionTypes.GET_PRODUCT_REQUEST, getProduct);
  yield takeLatest(ProductActionTypes.PRODUCT_SAVE_REQUEST, saveProduct);
}
  1. Определите каждый из методов, например get:
function* getProduct() {
  try {
    yield put({ type: actionTypes.SET_PRODUCTS_LOADING });

    const data = yield call(products.fetchProductsAsync);

    yield put({ type: actionTypes.GET_PRODUCTS_COMPLETE, payload: data });

  } catch (e) {
    console.log("Error");
  }
}
  1. Наконец, определите метод действия в dispatchToProps и запускайте его, где хотите:
const mapDispatchToProps = (dispatch: any) => ({
  getProducts: () => dispatch(productActions.getProducts()),
  saveProduct: (ids: number[]) => dispatch(productActions.saveProduct(ids)),
});
componentDidMount() {
  this.props.getProducts();
}
person frangaliana    schedule 17.07.2019
comment
Спасибо за ваш ответ. Но это не помогает - person Jeeva J; 17.07.2019
comment
Не могли бы вы добавить образец codeandbox с вашей проблемой, который можно воспроизвести? - person frangaliana; 17.07.2019
comment
Это моя ошибка. Я добавил повторяющуюся строку действия. Поскольку ваш ответ является хорошим подходом, я проголосовал за. Спасибо за ваш ответ. - person Jeeva J; 17.07.2019