#rxjs #redux-observable
#rxjs #redux-наблюдаемый
Вопрос:
Новое в RxJS. И redux-наблюдаемый.
У меня возникли проблемы, я пытаюсь отправить промежуточный поток действий of(takeAction())
в приведенном ниже коде, затем прослушиваю ответные действия из этого, либо RESOLVE_TAKE
типа, либо REJECT_TAKE
типа. Однако мой of(takeAction)
не запускается, кто-нибудь знает, как исправить этот код ниже?
Помимо этого вопроса, бонус: Любые советы по стилю о том, как реструктурировать мой код, я не уверен, что это самый чистый и читаемый способ. Я выполняю выборку, затем a switch
для разных кодов состояния, затем для получения res
(ответа на выборку) и reply
, и, если возможно, превращаю ответ в json, а затем передаю res
и reply
оба в качестве аргументов takeAction
. Затем дождитесь, пока takeAction
конвейер отправит либо RESOLVE_TAKE
или REJECT_TAKE
.
action$.pipe(
ofType(START_FOO),
switchMap({ url } =>
from(fetch(url)).pipe(
mergeMap(res => from(res.text()).pipe(
mergeMap(reply => {
try { reply = JSON.parse(reply) } catch(ignore) {}
switch (res.status) {
case 200: {
return of(takeAction(res, reply)).pipe( // not dispatching
action$.pipe(
ofType(RESOLVE_TAKE, REJECT_TAKE),
mergeMap(({ type }) => {
if (type === RESOLVE_TAKE) {
return of(resolveFooAction())
} else {
return of(rejectFooAction())
}
})
)
)
}
// other res.status cases go here
}
})
)
)
)
)
Ответ №1:
Проблема, похоже, связана с вашим of(takeAction(res, reply))
. В частности, это .pipe(...)
. Это отправка вашей команды «takeAction» на содержимое внутри .pipe
, а не на то, чтобы позволить ей «перетекать» в ваше хранилище Redux. Может быть, что-то вроде следующего будет работать лучше:
action$.pipe(
ofType(START_FOO),
switchMap({ url } =>
from(fetch(url)).pipe(
mergeMap(res => from(res.text()).pipe(
mergeMap(reply => {
try {
reply = JSON.parse(reply)
} catch (ignore) {
}
switch (res.status) {
case 200: {
return merge(
of(takeAction(res, reply)),
action$.pipe(
ofType(RESOLVE_TAKE, REJECT_TAKE),
map(({ type }) => {
if (type === RESOLVE_TAKE) {
return resolveFooAction()
} else {
return rejectFooAction()
}
}),
),
)
}
// other res.status cases go here
}
})
)
)
)
)
В приведенном выше of(takeAction(res, reply))
примере ни во что не передается. Вместо этого он «перетекает» обратно в хранилище Redux. Это merge
один из способов передать что-то, одновременно создавая другую подписку на поток действий для временного прослушивания другого события.
Комментарии:
1. О, ничего себе «отправка вашей команды «takeAction» на содержимое внутри .pipe» я думаю, это просто заставило что-то щелкнуть, большое вам спасибо за это решение! Также я вижу, что вы сохранили аналогичное руководство по стилю для моего, что заставляет меня чувствовать «ДА! я думаю, что я все делаю правильно, rxjs! » Спасибо! 🙂
2. Как бы все изменилось, если бы вместо
merge
того, чтобы обходить это, мы сделали aconcat
? Действительноmerge
ли эти две вещи происходят в paralell?3. @Noitidart Да, параллельный или последовательный. Я признаю, я ленился выбирать слияние вместо объединения и не исследовал какие-либо возможные условия гонки, которые могут существовать, подписываясь на внутренние наблюдаемые. Я постараюсь добавить тест кода позже, чтобы подтвердить и сделать это более понятным.
4. Большое спасибо!!