RxJs:如何基于observable的状态循环?

时间:2015-12-12 23:54:00

标签: javascript reactive-programming rxjs

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

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

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

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

预期输出为:

            $.fancybox("#AddNews", {
            'autoScale': true,
            'transitionIn': 'elastic',
            'transitionOut': 'elastic',
            'speedIn': 500,
            'speedOut': 300,
            'autoDimensions': true,
            'centerOnScroll': true,
            width: "100%",
            height: 870,
            'autoSize': false,
            afterLoad: function () {
                //init tinymce in your form here
                debugger;
                if(tt)
                    CreateTinyMCE();
                tt = false;
            }
        });

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

2 个答案:

答案 0 :(得分:9)

通过允许递归调用选择器函数,可以使expand运算符靠近。在这种情况下,返回一个空的observable将是你的休息。见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));

答案 1 :(得分:5)

使用expand运算符并使用Rx.Observable.emptyhttp://jsfiddle.net/naaycu71/3/)发送递归信号时,不完全是您想要的但是关闭:

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