Tôi cần triển khai phiên bản CombineLatest
(Tôi sẽ gọi nó là WithLatest
tại đây) gọi bộ chọn cho mọi mục ở bên trái và mục mới nhất ở bên phải. Nó không nên đẩy cho các hạng mục bên phải chỉ thay đổi.CombineLatest, nhưng chỉ đẩy cho bên trái
Tôi nghĩ rằng điều này được xây dựng Observable.Create
hoặc kết hợp các tiện ích mở rộng hiện tại không đặc biệt quan trọng; Tôi sẽ làm cho điều này là một phương pháp mở rộng "đóng hộp" một trong hai cách.
Ví dụ
var left = new Subject<int>();
var right = new Subject<int>();
left.WithLatest(right, (l,r) => l + " " + r).Dump();
left.OnNext(1); // <1>
left.OnNext(2); // <2>
right.OnNext(1); // <3>
right.OnNext(2); // <4>
left.OnNext(3); // <5>
nên năng suất
2 1
3 2
Sửa: Logic của ví dụ của tôi đi:
- Left trở nên dân cư với 1. Phải là trống rỗng, không có giá trị nào được đẩy.
- Trái được cập nhật với 2 (nó quên giá trị trước đó). Ngay bây giờ vẫn còn trống rỗng, vì vậy không có gì được đẩy.
- Phải trở thành dân cư với 1, vì vậy Trái = 2 (giá trị mới nhất), Phải = 1 được đẩy. Đến thời điểm này, không có sự khác biệt giữa
WithLatest
vàCombineLatest
- Quyền được cập nhật - không có gì được đẩy. Đây là những gì khác nhau
- Còn lại được cập nhật với 3, vì vậy Trái = 3, Phải = 2 (giá trị mới nhất) được đẩy.
Nó được đề nghị tôi thử:
var lr = right.ObserveOn(Scheduler.TaskPool).Latest();
left.Select(l => l + " " + lr.First()).Dump();
nhưng khối này trên thread hiện hành đối với thử nghiệm của tôi.
Bạn muốn thực hiện điều này với các bộ kết hợp hiện có, hoặc thực hiện bằng cách sử dụng tùy chọn 'Tạo()'? –
Ví dụ của bạn không khớp với những gì tôi mong đợi từ mô tả của bạn. Mục đầu tiên được trả lại trong ví dụ của bạn dường như được kích hoạt bởi một thay đổi ở bên phải có thể quan sát được. Nên kích hoạt 'WithLatest' ở bên phải đầu tiên nếu đã có các mục từ bên trái? –
@Gideon Engelberth: Đồng ý. Điều đó khiến tôi bối rối. Theo mô tả, thuật toán sẽ chỉ mang lại "3 2". – 3dGrabber