我正在尝试让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;
}
});
假设这是一个可解决的问题,我不清楚你如何标记循环时想要返回的“开始”。
答案 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.empty
(http://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