я борюсь с redux-observable
, пытаясь выяснить, как создать эпопею с этим потоком:использования Redux-наблюдаемым эпос декорировать данные через несколько действий
- слушать для
GET_ITEMS_REQUEST
действий - Написать запрос HTTP, чтобы получить некоторые пункты
- захватить идентификаторы этих элементов и направить
GET_ITEM_DETAILS_REQUEST
действия, которое будет отправить еще один запрос HTTP, чтобы получить некоторые дополнительные детали для этих элементов - украшают элементы из первого запроса с ДЭТОЙ ils со второго запроса и отправить окончательное действие
GET_ITEMS_SUCCESS
, в котором будет обновлено состояние редукции
Переход с шага 3 в 4, где я застрял. Я знаю, как отправить GET_ITEM_DETAILS_REQUEST
с идентификаторами элементов, но я не знаю, как прослушать/подписаться на действие GET_ITEM_DETAILS_REQUEST
, чтобы получить ответ детали.
До сих пор у меня есть следующие:
function getItemsEpic(action$) {
return action$
// step 1
.ofType('GET_ITEMS_REQUEST')
.mergeMap(() => {
// step 2
return Observable.from(Api.getItems())
})
.mergeMap((items) => {
// step 3
const itemIds = items.map((item) => item.id);
return Observable.of({
type: 'GET_ITEM_DETAILS_REQUEST',
ids: itemIds
});
})
// ... what now?
.catch(() => {
return Observable.of({
type: 'GET_ITEMS_FAILURE'
});
});
}
Я сделал важное изменение: я забыл добавить 'take (1)' после 'action $ .ofType ('GET_ITEM_DETAILS_FULFILLED')'. Это важно, потому что иначе ваш эпический навсегда будет их слушать, а с помощью 'mergeMap' будет бесконечно накапливаться все больше и больше. – jayphelps
Это выглядит великолепно, спасибо! Какие гарантии того, что 'GET_ITEM_DETAILS_FULFILLED' будет точно ответом на запрошенный запрос данных, который был немедленно отправлен? Что делать, если есть еще один «GET_ITEM_DETAILS_FULFILLED», который был отправлен до того, как запрос на получение информации вернется с ответом? – Hristo
Кстати, спасибо за заметку о 'catch()'. Я тоже борется с этим. – Hristo