javascript-RxJS中的`race`运算符是否相反?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-RxJS中的`race`运算符是否相反?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1591字,纯文字阅读大概需要3分钟。
内容图文
![javascript-RxJS中的`race`运算符是否相反?](/upload/InfoBanner/zyjiaocheng/692/6369be1801d34be78f3364725dc0bee0.jpg)
我有两个可观察对象,我想听最后一个发出第一个值的对象,是否有运算符可用于此?像这样:
let obs1 = Rx.Observable.timer(500,500);
let obs2 = Rx.Observable.timer(1000,1000); // I want the values from this one
let sloth = Rx.Observable.sloth(obs1,obs2);
可观察到的树懒将从obs2发出值,因为它是最后发出第一个值的树懒.
如果不是这种情况,还有其他方法吗?
解决方法:
我喜欢您的解决方案(尽管我怀疑如果流很热,您可能永远看不到第一个发出的值-如果源很冷,那么一切似乎都不错).你可以做一个jsfiddle来检查吗?如果您不遗漏任何价值,那么您的解决方案就是最好的.如果这样做,则可以通过将跳过的值添加回源中来进行更正(obs1.take(1).map(val => obs1.startWith(val)).
否则,对于一般的冗长解决方案,此处的关键是您拥有状态,因此还需要扫描运算符.我们用索引标记源,并保持一个状态,该状态代表已经开始的源的索引.当除了一个以外的所有东西都开始时,我们知道一个没有的人的索引,并且我们仅从那一个中选择值.请注意,这应该与来源是冷还是热无关,因为所有内容都是一次通过的,即没有多个订阅.
Rx.Observable.merge(
obs1.map(val => {val, sourceId: 1})
obs2.map(val => {val, sourceId: 2})
obsn.map(val => {val, sourceId: n})
).scan(
(acc, valueStruct) => {
acc.valueStruct = valueStruct
acc.alreadyEmitted[valueStruct.sourceId - 1] = true
if (acc.alreadyEmitted.filter(Boolean).length === n - 1) {
acc.lastSourceId = 1 + acc.alreadyEmitted.findIndex(element => element === false)
}
return acc
}, {alreadyEmitted : new Array(n).fill(false), lastSourceId : 0, valueStruct: null}
)
.map (acc => acc.valueStruct.sourceId === acc.lastSourceId ? acc.valueStruct.val : null )
.filter(Boolean)
也许更短,我不知道.我会试着把它摆弄一下,看看它是否真正起作用,或者在通知我之前您是否这样做.
内容总结
以上是互联网集市为您收集整理的javascript-RxJS中的`race`运算符是否相反?全部内容,希望文章能够帮你解决javascript-RxJS中的`race`运算符是否相反?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。