Есть ли более простой способ выполнить несколько типов действий в redux-saga? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть сага о редуксе, которая должна извлекать продукт из БД в состояние редукции.Но у него есть некоторые зависимости, которые должны быть извлечены первыми.

const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS'])

Запрос на эти зависимости запускается отдельно при загрузке страницы.Проблема в том, что они возвращаются в случайном порядке, и мне нужно take оба, если я хочу продолжить работу с остальной частью функции.

Мне удалось сделать это с помощью этой сумасшедшей штуковины, которая работает,но есть ли более простой способ сделать это?

Другая проблема заключается в том, что если оба эти

const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS'])

возвращаются до того, как getProductSaga() может даже сработать, то вся функция застревает.

Это полный код этой саги:

export function* getProductSaga(action) {
    try {
        const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS'])
        if (result.type === 'GET_CATEGORIES_SUCCESS') {
            yield take(['GET_TYPES_SUCCESS'])
        } else {
            yield take(['GET_CATEGORIES_SUCCESS'])
        }
        const product = yield call(api.product.get, action.id)
        yield put(getProductSuccess(product))
        yield put(setEditLoadingSuccess(action.id))
    } catch (err) {
        console.error(err.response.data.errors)
    }
}

1 Ответ

1 голос
/ 01 июля 2019

Мне удалось сделать это с помощью этой сумасшедшей штуковины, которая работает, но есть ли более простой способ сделать это?

Да, используйте all. Он запустит произвольное количество эффектов и подождет, пока они не завершатся, прежде чем перейти к следующей строке.

export function* getProductSaga(action) {
  try {
    // You can leave off the left hand side if you don't care about the results
    const [categoriesSuccessAction, typesSuccessAction] = yield all([
      take('GET_CATEGORIES_SUCCESS'),
      take('GET_TYPES_SUCCESS'),
    ]);

    const product = yield call(api.product.get, action.id)
    // etc
  } catch (err) {
    console.error(err.response.data.errors)
  }
}

Другая проблема заключается в том, что если оба этих [...] возвращаются до того, как getProductSaga () может даже запустить, то вся функция застревает.

Это правда. Вы захотите прослушать эти действия, только если у вас есть разумное ожидание, что они произойдут. К сожалению, поскольку я не знаю, как устроено остальное ваше приложение, я не могу дать очень конкретную рекомендацию. Возможно, вы могли бы проверить, содержит ли хранилище какое-то значение, и если так, пропустите take s.

...