RxJs 6 merangkai banyak langganan

Saya memiliki aplikasi Angular 6. Saya memutakhirkan rxjs ke 6.

Di versi aplikasi sebelumnya saya harus melakukan panggilan seperti ini...

Saya memanggil observasi Lakukan sesuatu dengan hasilnya Kemudian panggil observasi lain menggunakan nilai dari yang terakhir Lakukan sesuatu dengan hasilnya

Lakukan ini menggunakan concatmap. Kodenya terlihat seperti ini...

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

Saya mencoba menulis ulang ini menggunakan rxjs6 dan kata kunci pipa dan tanpa concatmap.

Saat ini saya punya...

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;
                }
                ))
            }
        )   
);

Saya tidak pernah melihat '1' masuk ke konsol. Adakah ide bagaimana saya harus melakukan ini?


MEMPERBARUI:

Saya tahu memiliki kode di bawah ini. Saya pikir itu hampir benar, namun saya tidak melihat belasungkawa terakhir.log cetakan 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) })
    );

Apa yang saya lewatkan?


person Ben Cameron    schedule 11.07.2018    source sumber
comment
Jika this._GeoCoderService.getAddress mengembalikan Observable, Anda perlu menggunakan concatMap (atau mergeMap dalam kasus ini). Anda juga harus berlangganan di akhir rantai.   -  person martin    schedule 11.07.2018
comment
Mengapa Anda melakukan .tap() di dalam subscribe()?   -  person CozyAzure    schedule 12.07.2018
comment
Anda tidak boleh tapdi subscribe - cukup subscribe((address: string) => console.log(1));   -  person dsych    schedule 12.07.2018


Jawaban (2)


Saya tidak akan menghilangkan operator concatMap. Ini paling cocok untuk pekerjaan itu. Untuk membuatnya lebih bersih, saya juga tidak akan menyimpan data di dalam operator map. Untuk efek samping, tap adalah pilihan terbaik untuk kode yang dapat dibaca.

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 telah dihapus dari rxjs6 jadi saya ingin mengeluarkannya dari kode saya. - person Ben Cameron; 11.07.2018
comment
Tidak, concatMap belum dihapus dari RxJS6. Itu masih ada di rxjs/operators. Ini adalah cara paling sederhana untuk bekerja dengan observasi tingkat tinggi. Saya ragu keluarga operator ini akan dihapus dari RxJS. - person kvetis; 13.07.2018

Setelah pipe() Anda harus .subscribe() (yang dapat diamati malas dan jika Anda hanya melakukan pipe() itu tidak terpicu tetapi subscribe terpicu)

person dsych    schedule 11.07.2018