Вложенный skipWhile в rxjs

У меня есть вложенные запросы API, и я разделил их, как если бы я делал это с обещаниями (.then) с оператором flatMap. Так что это прекрасно работает, но я также должен проверить, действителен ли ответ, а если нет, я буду ждать правильного ответа, поэтому я добавил оператор skipWhile.

init(): Observable<any> {
    return this.loadDataA();   
}    

loadDataA(): Observable<any> {

    return this._serviceA.loadData()
        .skipWhile((foo) => foo === undefined)
        .flatMap((foo) => this.loadDataB(foo.importantProp));
}

loadDataB(important: string): Observable <any> {

    return this._serviceB.loadData(important)
        .skipWhile((bar) => bar === undefined)
        .map((bar) => true);
}

Проблема в том, что первый skipWhile в функции loadDataA работает как надо, он не переходит в flatMap, если ответ не определен. Оператор skipWhile в loadDataB не входит в .map, но возвращается к плоской карте loadDataA, поэтому он никогда не выполняет .map в функции loadDataB. Итак, как я могу выполнить вложенное поведение skipWhile? Спасибо!


person derEntwickler    schedule 27.02.2017    source источник


Ответы (1)


Я не знаю, как выглядит ваш _serviceA.loadData(), но у меня есть сильное подозрение, что вам, вероятно, лучше использовать filter-оператор:

loadDataA(): Observable<any> {
    return this._serviceA.loadData()
        .filter(foo => foo != null) // will not emit any data if it is null or undefined
        .flatMap(foo => this.loadDataB(foo.importantProp));
}

loadDataB(important: string): Observable <any> {
    return this._serviceB.loadData(important)
        .filter(bar => bar != null)
        .mapTo(true);
}
person olsn    schedule 27.02.2017
comment
Проблема с оператором фильтра заключается в том, что он будет фильтровать неопределенный ответ, но я не получу действительный ответ в потоке. С помощью skipWhile я бы пропустил ответы до тех пор, пока не будет получен действительный. - person derEntwickler; 27.02.2017
comment
Я не думаю, что понимаю, что вы только что сказали - может быть, вы можете нарисовать диаграмму потока для вашего случая - но фильтр не имеет никакого влияния на то, какие данные он будет получать - он будет получать все данные, которые испускаются из его источника, он просто пропустит определенные данные. - person olsn; 27.02.2017