นี่เป็นอีกเรื่องหนึ่ง แต่ฉันรู้สึกตรงไปตรงมาและใช้งานง่ายกว่า (หรืออย่างน้อยก็เป็นธรรมชาติถ้าคุณคุ้นเคยกับคำสัญญา) เข้าหา โดยพื้นฐานแล้วคุณจะสร้าง 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
เสร็จแล้ว!