Умный способ для 2-х или 3-х кратных эффектов редукс-саги с одинаковым последующим потоком
У меня есть 2 из 3 эффектов, участвующих в гонке друг против друга, что должно привести к обновлению с сервера, если они выиграют гонку.
Вот как я сейчас это делаю:
function* refreshItems() {
while (true) {
bool refreshFromServer = true
const { nextRefresh, items } = yield call(fetchItems)
const racer = {
duration: call(delay, 60*1000),
manual: take(REFRESH_ITEMS),
}
if (nextRefresh > 0) {
racer.remote = call(delay, nextRefresh * 1000)
}
const { remote, manual, duration } = yield race(racer)
refreshFromServer = remote || manual
// alternative: refreshFromServer = !duration
}
}
Интересно, есть ли более разумный способ облегчить ответный результат гонки?
1 ответ
Решение
Ваш путь кажется хорошим, но одна вещь, которую вы могли бы сделать, это составить гонки. Что-то вроде (не проверено):
function* refreshItems() {
while (true) {
const { nextRefresh, items } = yield call(fetchItems)
const refreshRace = {
manual: take(REFRESH_ITEMS)
}
if (nextRefresh > 0) {
refreshRace.remote = call(delay, nextRefresh * 1000)
}
const racer = {
duration: call(delay, 60*1000),
refresh: race(refreshRace),
}
const { refresh, duration } = yield race(racer)
... just use refresh, now
}
}
Кстати, некоторые другие заметки:
- Ваша гонка двух задержек кажется немного глупой
- в зависимости от того, что именно вы хотите, вы можете использовать debounce? или напишите что-нибудь подобное