RxJs 6 объединение нескольких подписок в цепочку

У меня есть приложение Angular 6. Я обновляю rxjs до 6.

В предыдущей версии приложения мне приходилось звонить так ...

Я вызываю наблюдаемый. Сделайте что-нибудь с его результатом. Затем вызываю другой наблюдаемый объект, используя значение из последнего. Сделайте что-нибудь с его результатом.

Для этого используется concatmap. Код выглядел так ...

this.service1.getData().concatMap(d1 => {
            this.d1Local = d1;
            return this.service2.getData(d1);
        }).subscribe(
            this.d2Local = d2,
            error => errorFunction);

Я пытаюсь переписать это, используя rxjs6 и ключевое слово pipe и без concatmap.

У меня сейчас есть ...

this._LocationService.getLocation()
    .pipe(           
        map(location => {
            console.log(1);
            this.location = location;
            return this._GeoCoderService.getAddress(location)
                .pipe
                (map(address => {
                this.address = "You are near " + address;
                    this.showSpinner = false;
                }
                ))
            }
        )   
);

Я никогда не видел, чтобы на консоли регистрировалась цифра «1». Есть идеи, как мне это делать?


ОБНОВИТЬ:

Я знаю, что у меня есть код ниже. Я думаю, что это почти правильно, но я не вижу последнего вывода condole.log 1 ....

this._LocationService.getLocation()
    .pipe(map((location: ILocation) => {
        this.location = location;
        return this._GeoCoderService.getAddress(location);
    })
        , catchError(error => { this.showSpinner = false; return throwError('Something went wrong!') })
    ).subscribe(
        tap((address: string) => { console.log(1) })
    );

Что мне не хватает?


person Ben Cameron    schedule 11.07.2018    source источник
comment
Если this._GeoCoderService.getAddress возвращает Observable, вам нужно использовать concatMap (или mergeMap в этом случае). Также нужно подписаться в конце цепочки.   -  person martin    schedule 11.07.2018
comment
Зачем вам делать .tap() внутри subscribe()?   -  person CozyAzure    schedule 12.07.2018
comment
Вы не должны tap в subscribe - просто subscribe((address: string) => console.log(1));   -  person dsych    schedule 12.07.2018


Ответы (2)


Я бы не стал избавляться от оператора concatMap. Он лучше всего подходит для работы. Чтобы все было чище, я бы тоже не стал хранить данные внутри оператора map. Что касается побочных эффектов, tap - лучший вариант для читаемого кода.

this.service1.getData().pipe(
        tap(d1 => this.d1Local = d1),
        concatMap(d1 => this.service2.getData(d1),
    ).subscribe(
        d2 => this.d2Local = d2,
        error => errorFunction);
person kvetis    schedule 11.07.2018
comment
Concatmap был удален из rxjs6, поэтому я хочу вытащить его из своего кода. - person Ben Cameron; 11.07.2018
comment
Нет, concatMap не был удален из RxJS6. Он все еще там в rxjs/operators. Это самый простой способ работать с наблюдаемыми более высокого порядка. Я сомневаюсь, что это семейство операторов когда-нибудь будет удалено из RxJS. - person kvetis; 13.07.2018

После pipe() вы должны .subscribe() (наблюдаемые ленивы, и если вы просто сделаете pipe(), он не сработает, а subscribe сработает)

person dsych    schedule 11.07.2018