Проблема в том, что я не возвращаю Наблюдаемое на моей внутренней карте. Изменение:
return Creators.savePoster(film, poster);
до
return of(Creators.savePoster(film, poster));
заставляет это работать.
Кстати, при использовании с forkJoin
также возможно (и в моем случае лучше) взять сопоставленные результаты после того, как все запросы разрешены, и отправить одно действие вместо нескольких:
const loadPosters = (action$) => action$.pipe(
ofType(Types.INIT_SUCCESS),
mergeMap(({ films }) =>
forkJoin(
films.map(film =>
ajax
.getJSON(`https://api.themoviedb.org/3/search/movie?query=${film.title}`)
.pipe(
map(response => ({ film, response }))
)
),
)
),
mergeMap(data => {
const posters = data.reduce((acc, { film, response}) => ({
...acc,
[film.id]: `http://image.tmdb.org/t/p/w500/${response.results[0].poster_path}`,
}), {});
return of(Creators.savePosters(posters));
})
);
На самом деле это мое любимое решение.