2016-06-12 35 views
28

tôi đang học RxJS và góc 2. Hãy nói rằng tôi có một chuỗi lời hứa với nhiều chức năng cuộc gọi async mà phụ thuộc vào kết quả trước đó của trông giống như:Chaining quan sát trong RxJS

var promiseChain = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     resolve(result + 2); 
    }, 1000); 
    }); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
     resolve(result + 3); 
     }, 1000); 
    }); 
}); 

promiseChain.then((finalResult) => { 
    console.log(finalResult); 
}); 

nỗ lực của tôi tại làm chỉ sử dụng RxJS mà không sử dụng lời hứa được tạo ra như sau:

var observableChain = Observable.create((observer) => { 
    setTimeout(() => { 
    observer.next(1); 
    observer.complete(); 
    }, 1000); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 2); 
     observer.complete() 
    }, 1000); 
    }); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 3); 
     observer.complete() 
    }, 1000); 
    }); 
}); 

observableChain.subscribe((finalResult) => { 
    console.log(finalResult); 
}); 

Nó mang lại kết quả tương tự như chuỗi lời hứa. Câu hỏi của tôi là

  1. Tôi có làm đúng không? Có bất kỳ cải tiến liên quan đến RxJS nào mà tôi có thể thực hiện đối với mã trên không

  2. Làm cách nào để chuỗi này có thể quan sát được thực thi nhiều lần? tức là Thêm một đăng ký khác ở cuối chỉ tạo thêm 6 đăng ký mặc dù tôi mong đợi nó in 1, 3 và 6.

    observableChain.subscribe ((finalResult) => { console.log (finalResult); });

    observableChain.subscribe ((finalResult) => { console.log (finalResult); });

Trả lời

21

Về phần lời hứa vs Rxjs, vì đây là một câu hỏi thường gặp, bạn có thể tham khảo một số trước các câu hỏi về SO, trong đó:

Về cơ bản, flatMap tương đương với Promise.then.

Đối với câu hỏi thứ hai, bạn có muốn phát lại các giá trị đã được phát hành hay bạn muốn xử lý các giá trị mới khi chúng đến? Trong trường hợp đầu tiên, hãy kiểm tra toán tử publishReplay. Trong trường hợp thứ hai, đăng ký tiêu chuẩn là đủ. Tuy nhiên bạn có thể cần phải nhận thức được cái lạnh. so với phân đôi nóng tùy thuộc vào nguồn của bạn (xem Hot and Cold observables : are there 'hot' and 'cold' operators? để được giải thích minh họa về khái niệm này)

Các vấn đề liên quan