javascript - Bagaimana cara switchmap - memancarkan objek yang berisi baik observable asli maupun yang baru?


Saya ingin membuat sebuah observable yang pertama-tama mendapatkan nilai dari sebuah fungsi async, kemudian menggunakan nilai itu untuk mendapatkan nilai lain secara asynchronous, dan memancarkan sebuah objek yang berisi kedua nilai tersebut.

Sesuatu seperti:

function getValue1(){
    // asynchronously...
    return Observable.of(value1);
}

function getValue2UsingValue1(value1){
    // asynchronously...
    // value1 is needed to get value2...
    return Observable.of(value2);
}

getValue1()
    .switchMap(value1=> getValue2UsingValue1(value1))
    //...
    // I want to get an observable that emits an object containing value1 
    // and value2: {value1: value1, value2: value2}

Setiap bantuan sangat dihargai.

Jawaban #1

Saya pikir kamu bisa membuat:

var value1Cached = getValue1().publishReplay(1);
value1Cached.connect();
var value2 = value1Cached.concatMap(value1 => getValue2UsingValue1(value1));

Observable.forkJoin(value1Cached, value2)
    .map(values => {
        return {'value1': values[0], 'value2': values[1]};
    })
    .subscribe(val => console.log(val));

Saya menggunakan operator publishReplay() untuk mengubah Observable ini menjadi ConnectableObservable dengan ReplaySubject di dalamnya untuk mendukung caching. Saya kira Anda tidak ingin memanggil getValue1() dua kali.

Kemudian forkJoin() menunggu kedua Observable selesai dan memancarkan nilai-nilai mereka dalam sebuah array.

Lihat demo langsung: https://jsbin.com/posanup/3/edit?js,console

Ini mencetak ke konsol:

[object Object] {
  value1: "value1",
  value2: "value2"
}