我试图返回给定给定源$ action的epic的2个单独的值。但是 - 看来我只能通过明确订阅内部观察到的可见来做到这一点。我的史诗目前看起来像这样:
export const orderItemEpic = action$ =>
action$.ofType(ORDER_ITEM)
.switchMap(action => Observable.of(
api.createOrder(action.payload.order),
api.updateItem(action.payload.item, action.payload.item._id)
))
.map(val => console.log('Outer Observable', val));
但是,这仅散发出第一个API请求的承诺(即使两者都称为)
我可以同时获得两个值的唯一方法是明确订阅这样的内部观察值:
export const orderItemEpic = action$ =>
action$.ofType(ORDER_ITEM)
.switchMap(action => Observable.of(
api.createOrder(action.payload.order),
api.updateItem(action.payload.item, action.payload.item._id)
).map(val => val).subscribe(v => console.log('Inner Observable', v))
.map(val => console.log('Outer Observable', val)); //never gets called
,但是现在我的"外部"可观察到没有映射。
当我用jsbin嘲笑这个问题时,似乎第一个示例应该发出两个API调用的响应。http://jsbin.com/cejolegixo/edit?js,console
我想我只是想知道这是否是redux-observable中的怪癖,还是我做的事情不正确。
谢谢
这是因为您有3个可观察到的级别。
这仅排放第一个API请求的 Promise
如果您使用
,您的jsbin会更准确地镜像代码// First Mock API
const firstAPI = res => Rx.Observable.of({...res})
// Second Mock API
const secondAPI = res => Rx.Observable.of({...res})
因此,修复程序是"合并"内部可观测值。
// map value from source into inner observable, when complete emit result and move to next
const stream = source$.switchMap(action => Rx.Observable.merge(
firstAPI(action.payload.a),
secondAPI(action.payload.b)
))
ref jsbin
顺便说一句,您可以flatMap
而不是switchMap
。取决于您想要的行为。
switchMap
在第一个进度时第二次到达时将取消第一阶(如果它们是不同的订单,则似乎很糟糕)。