Javascript RxJs:如何基于可观察对象的状态进行循环?

Javascript RxJs:如何基于可观察对象的状态进行循环?,javascript,reactive-programming,rxjs,Javascript,Reactive Programming,Rxjs,我试图让RxJs在我的流中循环一个可观察的对象,直到它处于某种状态,然后让流继续。具体地说,我正在将同步do/while循环转换为RxJs,但我假设相同的答案也可以用于for或while循环 我想我可以使用doWhile()来实现这一点,但条件函数似乎无法访问流中的项,这似乎违背了我的目的 我不完全确定什么是我想要的正确的反应性术语,但这里有一个我想要的例子: var source=新的Rx.Observable.of({val:0,计数器:3}); source.map(o=>{ o、 计数器

我试图让RxJs在我的流中循环一个可观察的对象,直到它处于某种状态,然后让流继续。具体地说,我正在将同步do/while循环转换为RxJs,但我假设相同的答案也可以用于for或while循环

我想我可以使用doWhile()来实现这一点,但条件函数似乎无法访问流中的项,这似乎违背了我的目的

我不完全确定什么是我想要的正确的反应性术语,但这里有一个我想要的例子:

var source=新的Rx.Observable.of({val:0,计数器:3});
source.map(o=>{
o、 计数器--;
console.log('计数器:'+o.Counter);
如果(!o.计数器){
o、 val=“是的!”;
}
返回o;
})
.doWhile(o=>{
返回o.计数器>0;
})
.订阅(
功能(x){
console.log('Next:'+x.val);
},
功能(err){
log('Error:'+err);
},
函数(){
console.log('Completed');
});
预期产出将是:

Counter: 3
Counter: 2
Counter: 1
Counter: 0
Next: YESS!
Completed
假设这是一个可解决的问题,我不清楚在循环时如何标记要返回的位置的“开始”。

有一个操作符,它允许您递归调用选择器函数,从而使您接近目标。在这种情况下,返回一个空的可观察对象将是你的休息。见:


不完全是您想要的,而是使用
expand
操作符关闭,并使用
Rx.Observable.empty发出递归结束信号:

输出:

Next:  Object {val: 0, counter: 3}
Counter: 3
Next:  Object {val: 0, counter: 2}
Counter: 2
Next:  Object {val: 0, counter: 1}
Counter: 1
Next:  Object {val: 0, counter: 0}
Counter: 0
Completed

哼有趣的是,我可能能够做到这一点,如果我做到了,我会尝试使用它发回。expand().map()我的下游映射会多次处理值。我希望下游只处理最终结果。我想expand().filter().map()可能有用。我想到的另一种允许绕过向下游传递多个值的方法是主题。我自己也对一个干净的解决方案感兴趣:)。好的,我采用这个解决方案的问题是
值。计数器
是一个过度简化-实际上退出条件是由另一个异步流决定的。我知道这需要做很多工作,但是你能扩展你的示例以更好地反映你的情况吗?为什么您不能返回一个主题,独立于流进行工作(因此您不受可用的可观察操作符的约束),然后在完成后调用主题的onNext?
var source = new Rx.Observable.of({val: 0, counter: 3});

source.expand(function(o) {
  console.log('Counter: ' + o.counter);
  o.counter--;

return (o.counter >= 0) ? Rx.Observable.just(o) : Rx.Observable.empty()
})
.subscribe(
    function (x) {
        console.log('Next: ' , x);
    },
    function (err) {
        console.log('Error: ' + err);   
    },
    function () {
        console.log('Completed');   
    });
Next:  Object {val: 0, counter: 3}
Counter: 3
Next:  Object {val: 0, counter: 2}
Counter: 2
Next:  Object {val: 0, counter: 1}
Counter: 1
Next:  Object {val: 0, counter: 0}
Counter: 0
Completed