ngrx отправляет одно и то же действие несколько раз от эффекта - PullRequest
0 голосов
/ 01 ноября 2018

У меня довольно простая проблема, но я не могу понять, что я делаю неправильно - ни одно из решений, которые я нашел в Интернете, похоже, не работает для меня:

При открытии определенной части моего приложения отправляется действие для загрузки текущего списка идентификаторов элементов из серверной части.

Как только этот список найден - мне нужно загрузить все элементы, для которых я только что получил идентификатор.

( GET /api/items -> [1,2] -> GET /api/items/1, GET /api/items/2)

Я пытался решить эту проблему с таким эффектом:

Я выбрал mergeMap, потому что хочу выдать массив действий, но не обращаю внимания на их последовательность.

делает это так

@Effect() loadList$: Observable<LoadAction[]> = this.actions$.pipe(
    ofType<LoadListAction>(LOAD_LIST_ACTION),
    mergeMap( _ =>
      this.backendService.getItemIds().pipe(
        filter( it => it.items.length > 0),
        map(response => response.items.map(it => new LoadAction(it.id));
        )
      )
    )
  );

дает мне эту ошибку:

"invalid action was dispatched" [{"type":"[ITEMS][INIT] load item", "payload":"1"}, {"type":"[ITEMS][INIT] load item", "payload":"2"}],
 TypeError: Actions must have a type property

, что имеет смысл, поскольку наблюдаемое теперь напрямую генерирует массив, поэтому я переключился на mergeMap два раза:

@Effect() loadList$: Observable<LoadAction[]> = this.actions$.pipe(
    ofType<LoadListAction>(LOAD_LIST_ACTION),
    mergeMap( _ =>
      this.backendService.getItemIds().pipe(
        filter( it => it.items.length > 0),
        mergeMap(response => response.items.map(it => new LoadAction(it.id));
        )
      )
    )
  );

здесь только последнее действие достигает редуктора (/api/items/2), первое действие исчезает и никогда не вступает в силу. (Я подтвердил, список имеет длину 2).

В чем здесь проблема?

...