У меня довольно простая проблема, но я не могу понять, что я делаю неправильно - ни одно из решений, которые я нашел в Интернете, похоже, не работает для меня:
При открытии определенной части моего приложения отправляется действие для загрузки текущего списка идентификаторов элементов из серверной части.
Как только этот список найден - мне нужно загрузить все элементы, для которых я только что получил идентификатор.
( 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).
В чем здесь проблема?