当源$是单个操作时,从redux-Observable Epic中发出2个值



我试图返回给定给定源$ 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在第一个进度时第二次到达时将取消第一阶(如果它们是不同的订单,则似乎很糟糕)。

最新更新