如何在RxJs(v5)中循环?

时间:2016-12-28 15:14:05

标签: javascript rxjs rxjs5

我正在尝试以块的形式从服务器下载数据。我不知道会有多少次迭代,我只需要获取块,直到服务器响应“no-more-data”。

在v4中有doWhile运算符,但它是实验性的,并在最新版本中删除。

有一个similar question(虽然我不认为这是重复的!)建议使用expand,但我不确定它是否仍然是最佳或唯一的方法在第5节。

或许我开始解决错误的问题?... I.e.在这种情况下使用RxJ是一个好习惯,还是我不鼓励这样使用它(例如使用expand运算符来实现递归,假设没有更好的方法存在)???

如果这不是一般不适合Reactive Extensions样式的东西,为什么他们会删除doWhile运算符? (它甚至不在任何路线图上)

1 个答案:

答案 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