Lewati bersarang di rxjs

Saya memiliki permintaan api bertingkat dan saya membaginya seperti saya melakukannya dengan Promises (.then) dengan operator flatMap. Jadi ini berfungsi dengan baik tetapi saya juga harus memeriksa apakah responsnya valid dan jika tidak, saya akan menunggu respons yang benar, jadi saya menambahkan operator 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);
}

Masalahnya adalah skipWhile pertama dalam fungsi loadDataA berfungsi sebagaimana mestinya, tidak masuk ke flatMap jika responsnya tidak ditentukan. Operator skipWhile di loadDataB tidak masuk ke .map tetapi kembali ke flatmap loadDataA sehingga tidak pernah mengeksekusi .map di fungsi loadDataB. Jadi bagaimana saya bisa melakukan perilaku skipWhile yang bersarang? Terima kasih!


person derEntwickler    schedule 27.02.2017    source sumber


Jawaban (1)


Saya tidak tahu seperti apa _serviceA.loadData() Anda, namun saya memiliki kecurigaan kuat bahwa Anda mungkin lebih baik menggunakan filter-operator:

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
Masalah dengan operator filter adalah, ia akan memfilter respons yang tidak ditentukan tetapi saya tidak akan menerima respons yang valid di aliran. Dengan skipWhile saya akan melewatkan tanggapan sampai tanggapan yang valid diterima. - person derEntwickler; 27.02.2017
comment
Saya rasa saya tidak mengerti apa yang baru saja Anda katakan - mungkin Anda dapat menggambar diagram aliran untuk kasus Anda - tetapi filter tidak berpengaruh pada data apa yang akan diterimanya - filter akan menerima semua data yang dikeluarkan dari sumbernya, itu hanya akan menghilangkan data tertentu. - person olsn; 27.02.2017