นี่เป็นอีกเรื่องหนึ่ง แต่ฉันรู้สึกตรงไปตรงมาและใช้งานง่ายกว่า (หรืออย่างน้อยก็เป็นธรรมชาติถ้าคุณคุ้นเคยกับคำสัญญา) เข้าหา โดยพื้นฐานแล้วคุณจะสร้าง Observable โดยใช้Observable.create()
เพื่อห่อหุ้มone
และtwo
เป็น Observable เดียว ซึ่งคล้ายกับวิธีการPromise.all()
ทำงาน
var first = someObservable.take(1);
var second = Observable.create((observer) => {
return first.subscribe(
function onNext(value) {
},
function onError(error) {
observer.error(error);
},
function onComplete() {
someOtherObservable.take(1).subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
observer.complete();
}
);
}
);
});
เกิดอะไรขึ้นที่นี่? ขั้นแรกเราสร้าง Observable ใหม่ ฟังก์ชันที่ส่งผ่านไปยังObservable.create()
ชื่อ aptly onSubscription
จะถูกส่งผ่านผู้สังเกตการณ์ (สร้างขึ้นจากพารามิเตอร์ที่คุณส่งผ่านไปsubscribe()
) ซึ่งคล้ายกับresolve
และreject
รวมกันเป็นออบเจ็กต์เดียวเมื่อสร้าง Promise ใหม่ นี่คือวิธีที่เราทำให้เวทมนตร์ทำงานได้
ในonSubscription
เราสมัครสังเกตแรก (ในตัวอย่างข้างต้นนี้ถูกเรียกว่าone
) วิธีที่เราจัดการnext
และerror
ขึ้นอยู่กับคุณ แต่ค่าเริ่มต้นที่ให้ไว้ในตัวอย่างของฉันควรจะเหมาะสมโดยทั่วไปพูด อย่างไรก็ตามเมื่อเราได้รับcomplete
กิจกรรมซึ่งหมายความว่าone
เสร็จสิ้นแล้วเราสามารถสมัครรับ Observable ถัดไปได้ ดังนั้นการยิง Observable ที่สองหลังจากที่อันแรกเสร็จสมบูรณ์
ตัวอย่างผู้สังเกตการณ์ที่ให้ไว้สำหรับ Observable ตัวที่สองนั้นค่อนข้างง่าย โดยทั่วไปsecond
ตอนนี้จะทำหน้าที่เหมือนสิ่งที่คุณคาดหวังว่าtwo
จะทำเหมือนใน OP โดยเฉพาะอย่างยิ่งsecond
จะปล่อยค่าแรกและค่าแรกที่ปล่อยออกมาโดยsomeOtherObservable
(เพราะtake(1)
) จากนั้นจึงทำให้เสร็จสมบูรณ์โดยสมมติว่าไม่มีข้อผิดพลาด
ตัวอย่าง
นี่คือตัวอย่างการทำงานทั้งหมดที่คุณสามารถคัดลอก / วางได้หากคุณต้องการดูตัวอย่างของฉันที่ใช้งานได้ในชีวิตจริง:
var someObservable = Observable.from([1, 2, 3, 4, 5]);
var someOtherObservable = Observable.from([6, 7, 8, 9]);
var first = someObservable.take(1);
var second = Observable.create((observer) => {
return first.subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
someOtherObservable.take(1).subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
observer.complete();
}
);
}
);
}).subscribe(
function onNext(value) {
console.log(value);
},
function onError(error) {
console.error(error);
},
function onComplete() {
console.log("Done!");
}
);
หากคุณดูคอนโซลตัวอย่างด้านบนจะพิมพ์:
1
6
เสร็จแล้ว!