รอการสมัครสมาชิกภายในแผนที่หรือไม่?

เมื่อฉันพยายามสมัครสมาชิกภายในฟังก์ชัน map สิ่งที่สังเกตได้จะไม่รอให้การสมัครสมาชิกภายในดำเนินการ

ฉันมีดังต่อไปนี้:

        return this.http.get(url).map((project)=>{       
             // replace pilot id by pilot object 
             this.UserService.retrieveObject(project.pilot).subscribe(pilot => { 
                 project.pilot = pilot,
             })

             //replace owner id by owner object
             this.UserService.retrieveObject(project.owner).subscribe(owner => { 
                 project.owner = owner,
             })
             return project;
         });

ออบเจ็กต์ project ที่ส่งคืนประกอบด้วยเจ้าของ และรหัสนำร่องแทนออบเจ็กต์ เนื่องจากไม่รอการสมัครรับข้อมูล

จะทำอย่างไรเพื่อให้การสมัครสมาชิกภายในทั้งหมดเสร็จสิ้นได้อย่างสังเกตได้?


person a bsss    schedule 09.03.2018    source แหล่งที่มา
comment
stackoverflow.com/ คำถาม/40788163/   -  person Dionisis K    schedule 09.03.2018


คำตอบ (1)


คุณจะต้องปรับโครงสร้างใหม่อย่างมีนัยสำคัญ

คุณสามารถใช้ forkJoin เพื่อรอให้ Observables ทั้งสองเสร็จสมบูรณ์ จากนั้นใช้ฟังก์ชัน "การฉายภาพ" เพื่ออัปเดตวัตถุ project:

return this.http.get(url)
    .mergeMap(project => Observable.forkJoin(
        this.UserService.retrieveObject(project.pilot),
        this.UserService.retrieveObject(project.owner),
        (pilot, owner) => {
            project.pilot = pilot;
            project.owner = owner
            return project;
        }
    ));
person martin    schedule 09.03.2018
comment
สิ่งหนึ่งที่ควรชี้ให้เห็นคือพฤติกรรมข้อผิดพลาด: หากคำขอย่อยล้มเหลว ห่วงโซ่โดยรวมจะล้มเหลว - person Ingo Bürk; 09.03.2018
comment
ฉันรักพวกคุณ ฉันจะไม่เดาบทบาทของพารามิเตอร์ forkJoin ตัวสุดท้ายหากไม่มีคำตอบของคุณ ที วีเอ็ม - person a bsss; 09.03.2018
comment
@ IngoBürk จะทำอย่างไรเพื่อให้ดำเนินการแม้ว่าคำขอหนึ่งจะล้มเหลว - person a bsss; 09.03.2018
comment
คุณสามารถเพิ่ม .catch(…) ลงในคำขอภายใน forkJoin เพื่อจัดการข้อผิดพลาดในคำขอย่อยแต่ละรายการ - person Ingo Bürk; 09.03.2018