我正在尝试以块的形式从服务器下载数据。我不知道会有多少次迭代,我只需要获取块,直到服务器响应“no-more-data”。
在v4中有doWhile
运算符,但它是实验性的,并在最新版本中删除。
有一个similar question(虽然我不认为这是重复的!)建议使用expand
,但我不确定它是否仍然是最佳或唯一的方法在第5节。
或许我开始解决错误的问题?... I.e.在这种情况下使用RxJ是一个好习惯,还是我不鼓励这样使用它(例如使用expand
运算符来实现递归,假设没有更好的方法存在)???
如果这不是一般不适合Reactive Extensions样式的东西,为什么他们会删除doWhile
运算符? (它甚至不在任何路线图上)
答案 0 :(得分:0)
expand
首先传递输入,然后将其自身作为输入。重复此过程,直到没有输入(Observable.empty()
)。
我在TypeScript中编写了演示文稿。
interface RSP {
header:string;
value:string;
};
function requestMaker(numChunk:number) {
return () => {
numChunk > 0 ? numChunk-- : 0;
return Observable.of(numChunk > 0 ? ['CONT', 'value'] : ['END', 'value']).delay(300);
}
}
let simulateRequest = requestMaker(5);
simulateRequest()
.expand(([header, value]) => {
if (header == 'CONT') {
return simulateRequest();
}
else {
return Observable.empty();
}
})
.subscribe(
([header, value]) => console.log(`NEXT: ${header}-${value}`),
error => console.log(`ERROR: ${error}`),
() => console.log('completed')
)
<强>结果:强>
NEXT: CONT-value
NEXT: CONT-value
NEXT: CONT-value
NEXT: CONT-value
NEXT: END-value
completed