ซ้อนกันในขณะที่อยู่ใน rxjs

ฉันมีคำขอ API ที่ซ้อนกันและแยกคำขอเหล่านั้นเหมือนกับที่ฉันจะทำกับ Promises (.then) ด้วยตัวดำเนินการ flatMap วิธีนี้ใช้งานได้ดี แต่ฉันต้องตรวจสอบด้วยว่าคำตอบนั้นถูกต้องหรือไม่ และหากไม่ ฉันจะรอคำตอบที่ถูกต้อง ดังนั้นฉันจึงเพิ่มโอเปอเรเตอร์ JumpWhile

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

ปัญหาคือว่าการข้ามครั้งแรกในฟังก์ชัน loadDataA ทำงานอย่างที่ควรจะเป็น แต่จะไม่เข้าสู่ flatMap หากไม่ได้กำหนดการตอบสนอง ตัวดำเนินการ skimpWhile ใน loadDataB ไม่ได้เข้าไปใน .map แต่จะส่งกลับไปยัง flatmap ของ loadDataA เพื่อไม่ให้ดำเนินการ .map ในฟังก์ชัน loadDataB ดังนั้นฉันจะดำเนินการข้ามขณะทำงานแบบซ้อนได้อย่างไร ขอบคุณ!


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