Redux Saga - объединяет похожие (но не все) действия в takeLeading / takeLatest - PullRequest
0 голосов
/ 20 ноября 2018

В настоящее время я использую redux-saga в проекте, и я хочу использовать его также для предотвращения многократного запроса одного и того же ресурса.

В настоящий момент на одной странице есть несколько компонентов, запрашивающих ресурс (т.е. отправка {types: "REQUEST_POST_COMMENTS", postId: <postIdHere>})

И у меня есть эта сага:

export function* loadPostComments() { yield takeLatest("REQUEST_POST_COMMENTS", loadPostComments); }

Моя страница отправляет следующие действия одновременно:

  • {types: "REQUEST_POST_COMMENTS", postId: 123}
  • {types: "REQUEST_POST_COMMENTS", postId: 321}
  • {types: "REQUEST_POST_COMMENTS", postId: 123}

И моя цель состоит в том, чтобы loadPostComments вызывался дважды, один раз для поста123 и один для поста 321.

Я переключился на takeLeading в бета-версии - но это вызовет loadPostComments только один раз.

Есть ли способ определить сагу, используяшаблон, но takeLatest для группировки их по значению action.type?Или какой-нибудь способ добиться чего-то похожего?

1 Ответ

0 голосов
/ 21 ноября 2018

Мое решение

Вы должны сохранить найденные postId с и к ним после:

function* watchRequestPostComments() {
  const encounteredPostIds = new Set()

  while(true) {
    const { postId } = yield take('REQUEST_POST_COMMENTS')
    if (!encounteredPostIds.has(postId) {
      yield fork(loadPostComments, postId)
    }
    encounteredPostIds.add(postId)
  }
}

Пояснение

Кажется, что не существует конкретногоРедукс-сага-esque способ сделать это.В любом случае вы должны отслеживать эти идентификаторы.

Я ответил на аналогичный вопрос о запросах регулирования .

PS: Это выглядит такбесконечная рекурсия.Должно быть непреднамеренное столкновение имен:

export function* loadPostComments() {
  yield takeLatest("REQUEST_POST_COMMENTS", loadPostComments)
}
...