您的位置:首页 > Web前端 > JavaScript

[RxJS] Refactoring CombineLatest to WithLatestFrom

2016-03-12 18:36 681 查看
This lesson shows why it’s preferable to using
withLatestFrom
instead of
combineLatest
in certain scenarios.

Timer will continue until you enter the number in the input field:

timer$
.do((x)=> console.log(x))
.combineLatest(
input$.do((x)=> console.log(x)),
(timer, input)=> ({count: timer.count, text: input})
)
.takeWhile((data)=> data.count <= 3)
.filter((data)=> data.count === parseInt(data.text))
.reduce((acc, curr)=> acc + 1, 0)
.subscribe(
(x)=> console.log(x),
err=> console.log(err),
()=> console.log('complete')
);


In this case, withLatestFrom() works the same way:

timer$
.do((x)=> console.log(x))
.withLatestFrom(
input$.do((x)=> console.log(x)),
(timer, input)=> ({count: timer.count, text: input})
)
.takeWhile((data)=> data.count <= 3)
.filter((data)=> data.count === parseInt(data.text))
.reduce((acc, curr)=> acc + 1, 0)
.subscribe(
(x)=> console.log(x),
err=> console.log(err),
()=> console.log('complete')
);


But let's say we only want the timer log out 3 times then it should hit the complete block, logout "complete":

timer$
.do((x)=> console.log(x))
.takeWhile((data)=> data.count <= 3)
.withLatestFrom(
input$.do((x)=> console.log(x)),
(timer, input)=> ({count: timer.count, text: input})
)
.filter((data)=> data.count === parseInt(data.text))
.reduce((acc, curr)=> acc + 1, 0)
.subscribe(
(x)=> console.log(x),
err=> console.log(err),
()=> console.log('complete')
);


then it only works with withLatestFrom() NOT combimeLatest().

The reason for that is combimeLatest require both timer$ and input$. But withLatestFrom() only need $timer.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: