【问题标题】:How to loop in RxJs (v5)?如何在 RxJs (v5) 中循环?
【发布时间】:2016-12-28 15:14:05
【问题描述】:

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

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

有一个similar question(虽然我不认为这是重复的!)建议使用expand,但我不确定它是否仍然是v5中最好的还是唯一的方法。

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

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

【问题讨论】:

  • 我建议也使用expand(),但是如果没有任何演示说明您要解决的问题,很难给出任何建议。
  • 注意 v5 不是 v4 的直接后续版本,它是从头开始的完全重新实现。操作符不存在的事实可能只是意味着它还没有被移植,或者它被认为不必要地膨胀了 API 表面。这可能是一个可以指向 GitHub 问题列表的问题。

标签: javascript rxjs rxjs5


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2017-09-13
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多