Умный способ для 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? или напишите что-нибудь подобное
Другие вопросы по тегам