javascript - RXJS nếu với observable như điều kiện
Tôi muốn sử dụng Rx.Observable.if để chạy một trong hai observable nếu một observable điều kiện được giải quyết thành true hoặc false.
Những gì tôi muốn đạt được sẽ trông giống như thế này:
Rx.Observable.if(conditionalObservable.map(x => x.length > 0), firstObservable, secondObservable).subscribe()
Nếu conditionalObservable gửi một giá trị tiếp theo và sau đó hoàn thành với giá trị true, firstObservable sẽ được chạy và nếu không, secondObservable sẽ được chạy.
Rõ ràng điều đó không hoạt động vì Rx.Observable.if yêu cầu một hàm điều kiện, không phải một observable. Làm thế nào tôi có thể đạt được chính xác cùng một chức năng trong RXJS?
Lưu ý: Vấn đề này gần như giống nhau nhưng tôi không nghĩ rằng nó đủ ngắn gọn vì 1) bạn phải có hai câu lệnh pausable và 2) trừ khi bạn thêm take(1) vào các observable điều kiện của mình, bạn không thể đảm bảo rằng điều kiện sẽ không phát ra thêm các sự kiện tiếp theo. Theo ý kiến của tôi, đây là một giải pháp tạm thời và dễ dẫn đến nhiều lỗi do con người.
Câu trả lời #1
Nếu tôi hiểu đúng, bạn có thể thử một cái gì đó như thế này:
conditionalObservable.map(x => x.length > 0)
.last()
.flatMap(function(condition){
return condition ? firstObservable : secondObservable});
.subscribe()
Tôi đã thêm phần last vì bạn đã đề cập rằng bạn muốn chọn observable của mình (thứ nhất hoặc thứ hai) dựa trên giá trị cuối cùng của conditionalObservable.
Tôi không chắc về giá trị của toán tử if ở đây, vì nó chuyển đổi dựa trên một giá trị scalar mà phải được tạo ra đồng bộ bởi hàm selector. Vì vậy, trừ khi bạn sử dụng hàm đó để trả về một biến có thể truy cập trong closure, và bạn có thể thay đổi tại điểm mà điều kiện của bạn được đánh giá, theo ý tôi nó không hữu ích lắm. Và ngay cả khi đó, selector của bạn trở thành một hàm không tinh khiết, điều này không phải là thực hành tốt nhất cho mục đích kiểm thử và các thứ khác.
Câu trả lời #2
Còn việc sử dụng switch thì sao?
conditionalObservable
.map(x => x.length > 0 ? firstObservable : secondObservable)
.switch()
.subscribe(...)
Hoặc flatMapLatest? Nếu tôi hiểu đúng tài liệu, điều này sẽ làm giống như cái trước:
conditionalObservable
.flatMapLatest(x => x.length > 0 ? firstObservable : secondObservable)
.subscribe(...)
