首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角5:多重可观测性的组合

角5:多重可观测性的组合
EN

Stack Overflow用户
提问于 2017-12-01 19:49:10
回答 2查看 822关注 0票数 0

我有一个关于可观测的数组,我想得到一个唯一的可观测值,如果我的数组中的所有可观测值都返回真的话,它将返回true。

我试过这个,但似乎没有用:

代码语言:javascript
复制
const t = [Observable.of(true), Observable.of(false)];
let obs = Observable.of(true);
t.forEach(o => obs = obs.concat(o));

const obsResult = obs.pipe(
  takeWhile(val => val !== false), 
  reduce((acc, val) => acc && val)
);
obsResult.subscribe(r => console.log('result', r));

t[1]是假的,所以我希望obsResult发送false,但是我得到了true

EN

回答 2

Stack Overflow用户

发布于 2017-12-01 22:10:49

纯粹在溪流中工作:

  1. 创建一个函数,使用.from将可观察到的数组封装到一个新的流中。
  2. .concatAll(),用于打开内部可观测值(数组中的可观测值)的新流。
  3. 然后使用.every,它接受一个谓词函数来测试随后未包装的可观测值的值。

现在,您将有一个函数返回一个可观察的函数,该函数将根据可观测值数组的聚合值发出true/false值。

代码语言:javascript
复制
console.clear();
const obsSetF = [Rx.Observable.of(true), Rx.Observable.of(false)];
const obsSetT = [Rx.Observable.of(true), Rx.Observable.of(true)];

function allTrue(obsSet) {
  return Rx.Observable
    .from(obsSet)
    .concatAll()
    .every(a => a === true)
}

allTrue(obsSetF).subscribe(console.log);
allTrue(obsSetT).subscribe(console.log);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.3/Rx.min.js"></script>

票数 0
EN

Stack Overflow用户

发布于 2017-12-02 04:51:54

combineLatest怎么样?

这将使用可观测值中传递的最新值来发出值。下面是它的工作方式的一个很好的可视化:combineLatest RxMarbles

但是,在这种情况下,最好不要传递项目函数,因为您只想做一个逻辑的、多个可观察的函数。

静态版本的Observable.combineLatest可以接收可观察到的数组,并将其值作为数组发布。

这里有一个例子

代码语言:javascript
复制
console.clear();
const tf = [Rx.Observable.of(true), Rx.Observable.of(false)];
const tt = [Rx.Observable.of(true), Rx.Observable.of(true)];

const obsResult =
  // if no projection function is passed to combineLatest
  // then it will emit an array of the latest values from the provided
  // observables in this case [true, false]
  Rx.Observable.combineLatest(tf)
    // map the output of this observable and perform a reduce to and
    // every value in the array
    .map((xs) => xs.reduce((acc, x) => acc && x));
obsResult.subscribe(r => console.log('result', r));
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.2/Rx.min.js"></script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47600513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档