Rxjs-将异步响应与同步响应合并
我开始使用RxJs 5制作功能链,并非常喜欢它。我注意到我经常遇到的一种模式,但无法找到使用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
值获得一些异步数据,然后将它们与值本身合并
让我用代码向您展示:
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在示例代码中,我并不真正需要可观察的。但这对于演示来说是相当简单的,而我拥有的真实代码,我确实需要可观察的对象。:-)