javascript - RxJs:如何根据可观察对象的状态进行循环?

标签 javascript reactive-programming rxjs

我试图让 RxJs 在我的流中循环一个 Observable 直到它处于特定状态,然后让流继续。具体来说,我正在将同步 do/while 循环转换为 RxJs,但我假设同样的答案也可以用于 for 或 while 循环。

我以为我可以为此使用 doWhile(),但似乎条件函数无法访问流中的项目,这似乎违背了我的目的。

我不完全确定正确的响应式术语是什么,但这是我想要的示例:

var source = new Rx.Observable.of({val: 0, counter: 3});

source.map(o => {
  o.counter--;
  console.log('Counter: ' + o.counter);

  if (!o.counter) {
    o.val = "YESS!";
  }
  return o;
})
.doWhile(o => { 
  return o.counter > 0; 
})
.subscribe(
    function (x) {
        console.log('Next: ' + x.val);
    },
    function (err) {
        console.log('Error: ' + err);   
    },
    function () {
        console.log('Completed');   
    });

预期的输出是:

Counter: 3
Counter: 2
Counter: 1
Counter: 0
Next: YESS!
Completed

假设这是一个可以解决的问题,我不清楚您如何标记循环时要返回的位置的“开始”。

最佳答案

expand运算符通过允许您递归调用选择器函数来让您接近。在这种情况下,返回一个空的可观察对象将是你的休息。参见 jsbin :

var source = Rx.Observable.return({val: 0, counter: 3})
    .expand(value =>  { 
      if(!value.counter) return Rx.Observable.empty();
      value.counter -= 1;
      if(!value.counter) value.val = 'YESS';
      return Rx.Observable.return(value)
    })
    .subscribe(value => console.log(value.counter ? 
                                    'Counter: ' + value.counter : 
                                    'Next: ' + value.val));

关于javascript - RxJs:如何根据可观察对象的状态进行循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34246398/

相关文章:

javascript - RxJS 在事件上发送多个唯一的 ajax 请求

javascript - 多次调用子组件构造函数

javascript - 这个移动平均函数是如何工作的?

javascript - Web 组件 - 每个插槽多个元素

javascript - 处理热、共享、可观察量的 "onNext"中抛出的错误的正确方法

RxJS 6.5.5 startWith 已弃用。选择

javascript - 从 JQuery 内部调用 PHP 函数 file_put_contents

angular - 如何使用 'merge' 来限制可观察值列表的并发性,但仅在所有可观察值完成后才返回?

angular - 展开运算符执行次数超过预期

angular - RxJS forkJoin 不发出值