Redux-Saga позволяет выполнять несколько действий и одну задачу

#javascript #reactjs #redux #react-redux #redux-saga

Вопрос:

У меня есть наблюдатель, похожий на этого

 export default function* watch() {
    yield takeEvery(getProducts, fetchData)
    yield takeEvery(getUser, fetchData)
}
 

Но в этой форме это не работает, потому что fetchData необходимо запускать один раз и только в том случае, если и GetProducts, и getUser прошли успешно

Можно ли каким-то образом перенести оба действия в takeEvery, или существует аналог takeEvery, который может принимать два или более действий и выполнять функцию fetchData только после успешного выполнения всех переданных действий?

Комментарии:

1.Являются getProducts ли и getUser возвращают шаблон?

2. @Alex да, это шаблон возврата

Ответ №1:

Вы можете использовать all в сочетании с take ожиданием двух действий независимо от порядка.

 export default function* watch() {
    yield all([
        take(getProducts),
        take(getUser)
    ])
    yield call(fetchData)
}
 

В случае, если вы хотите снова дождаться этих двух действий после завершения выборки, вы можете обернуть их бесконечным циклом:

 export default function* watch() {
    while (true) {
        yield all([
            take(getProducts),
            take(getUser)
        ])
        yield call(fetchData) 
    }
}
 

Вы также можете заменить call эффект, fork если вы не хотите ждать, пока будет выполнена выборка, прежде чем ждать другой пары действий.