Rxjs-将异步响应与同步响应合并

Rxjs-将异步响应与同步响应合并,rxjs,rxjs5,Rxjs,Rxjs5,我开始使用RxJs 5制作功能链,并非常喜欢它。我注意到我经常遇到的一种模式,但无法找到使用RxJs方法解决它的方法 我使用值获得一些异步数据,然后将它们与值本身合并 让我用代码向您展示: Rx.Observable.fromPromise(somePromise) // doesn't really matter .flatMap(value => { // this is the original value I have const promise = aFunctio

我开始使用RxJs 5制作功能链,并非常喜欢它。我注意到我经常遇到的一种模式,但无法找到使用RxJs方法解决它的方法

我使用
值获得一些异步数据,然后将它们与值本身合并

让我用代码向您展示:

Rx.Observable.fromPromise(somePromise) // doesn't really matter
  .flatMap(value => {  // this is the original value I have
    const promise = aFunctionThatReturnsPromise(value);
    return Promise.all([promise, value])); // I created a promise using this value, but I still want to keep value as well
  })
  .map(([promiseValue, originalValue]) => ({ // I merge new produced values with the value itself and get rid of array.
    value1: promiseValue.value1,
    value2: promiseValue.value2
    originalValue: originalValue
  }))
  // ...rest of the chain...
可以看出,这意味着创建一个与
promise.all
组合的promise,以保持
,并使用
map
创建一个清理阶段,以使链的以下部分变得更好


这种模式是否有内置的
RxJs结构?或者有没有另一种方法可以产生更清晰、更容易理解的解决方案?

使用纯RxJS,通常会嵌套可观察链以在上下文中保留以前的值:

Rx.Observable.fromPromise(somePromise)
  .flatMap(value =>
    Rx.Observable.fromPromise(aFunctionThatReturnsPromise(value))
      .map((promiseValue) => ({
        value1: promiseValue.value1,
        value2: promiseValue.value2,
        originalValue: value
      }))
  )
// ...rest of the chain...

如果使用太多,可能会很快失去控制,因此您通常会尝试尽快减少数据量(并返回外部数据流)。

当您想将输入值与输出值结合使用时,人们通常会写:

Rx.Observable.of('foo')
  .mergeMap(i => aFunctionThatReturnsPromise(i)
    .map(asyncResult => ({ foo: i, result: asyncResult})
  )
可以使用(
flatMap
if rxjs4)将此模式简化为以下内容:

Rx.Observable.of('foo')
  .mergeMap(
    i => aFunctionThatReturnsPromise(i),
    (i, asyncResult) => ({ syncValue: i, asyncResult })
  )
// ... rest of the chain

这使您能够访问原始输入值和接收到的每个输出值。额外的好处是,
mergeMap
将把您的承诺包装成一个可观察的,而不使用
Rx.observable.fromPromise()

为什么在这里可以观察到?你为什么不使用承诺呢?@TamasHegedus在示例代码中,我并不真正需要可观察的。但这对于演示来说是相当简单的,而我拥有的真实代码,我确实需要可观察的对象。:-)