2017-09-06 15 views
10

Tôi muốn ngăn chặn phát xạ xảy ra nếu và chỉ khi cùng một mục chính xác được phát ra trong vòng x mili giây cuối cùng. Tôi đã xem xét các nhà khai thác ga và các nhà khai thác nhưng tôi không chắc liệu họ có thể giúp tôi ở đây hay không. Có một nhà điều hành khác mà tôi có thể sử dụng hay tôi có thể soạn thảo chúng bằng cách nào đó không?Ngăn chặn phát xạ nếu cùng phát xạ xảy ra x mili giây trước

+0

bạn có thể cung cấp thêm thông tin? Ví dụ bạn đang làm việc với đối tượng nào, các mục được phát ra nhanh như thế nào? Bạn phát ra những thứ đó từ đâu? Có quan trọng đối với bạn những mục đó được phát ra từng cái một, hoặc chúng có thể được phát ra theo lô không? –

Trả lời

1

Bạn có thể dấu thời gian và ghép nối từng mục, sau đó kiểm tra các điều kiện biên của bạn về thời gian và bình đẳng.

randomSource 
       .timestamp() 
       .pairwise() 
       .where(pair => pair[0].timestamp - pair[1].timestamp < limit && pair[0].value === pair[1].value); 

Sau đó áp dụng .select(pair => pair[0].value) để lấy lại mục gốc của bạn.

dụ làm việc trong C#, với một nguồn mà tạo ra các mặt hàng ngẫu nhiên từ 1 đến 5 cách nhau qua thời điểm ngẫu nhiên:

static IObservable<T[]> Pairwise<T>(this IObservable<T> source) 
    { 
     source = source.Publish().RefCount(); 
     return source.Skip(1).Zip(source, (a, b) => new[] { a, b }); 
    } 

    static void Main(string[] args) 
    { 

     var randomSource = 
      Observable.Defer(() => Observable.Timer(TimeSpan.FromSeconds(new Random().NextDouble() * 2))).Repeat().Publish().RefCount().Select(_ => new Random().Next(1, 5)); 

     var limit = TimeSpan.FromSeconds(1); 

     var sameDebounce = 
     randomSource 
      .Timestamp() 
      .Pairwise() 
      .Where(pair => pair[0].Timestamp - pair[1].Timestamp < limit && pair[0].Value == pair[1].Value); 


     sameDebounce.Subscribe(c => Console.WriteLine("{0} {1}", c[0], c[1])); 
     Console.ReadLine(); 

    } 

Output:

[email protected]/7/2017 5:00:04 AM +00:00 [email protected]/7/2017 5:00:04 AM +00:00 
[email protected]/7/2017 5:00:09 AM +00:00 [email protected]/7/2017 5:00:08 AM +00:00 
[email protected]/7/2017 5:00:23 AM +00:00 [email protected]/7/2017 5:00:23 AM +00:00 
[email protected]/7/2017 5:00:33 AM +00:00 [email protected]/7/2017 5:00:32 AM +00:00 
1

Như câu hỏi của bạn không hoàn toàn giải thích kịch bản giống như so sánh giá trị phát xạ tiếp theo với giá trị được phát gần đây nhất hoặc bất kỳ giá trị được phát gần đây nào hoặc cái gì khác. Tôi sẽ có một cách chung để tiếp cận với giải pháp.

Ví dụ: RxJava.

Bạn có thể sử dụng timestamp() với filter() điều hành như sau:

ArrayList<String> list = new ArrayList<>(); 
     final long[] timeOfSubscribe = {-1}; 
     final long timeDuration = 2 * 1000; // 2 seconds 
     Observable.fromIterable(list) 
       .timestamp() 
       .filter(item -> item.time() > (timeDuration + timeOfSubscribe[0]) && item.value().equals("your last value")) 
       .doOnSubscribe(__ -> timeOfSubscribe[0] = Calendar.getInstance().getTimeInMillis()) 
       .subscribe(); 

Tôi đoán đoạn này có thể giúp bạn chỉ cần thay đổi so sánh giá trị phát ra bạn đăng nhập mà là trong filter() điều hành. Nếu bạn đang tìm giá trị được phát cuối cùng, bạn có thể dừng giá trị phát xạ cuối cùng bằng cách sử dụng toán tử doOnNext() (để có trường hợp đơn giản) hoặc nếu bạn tìm kiếm tất cả các giá trị phát được cuối cùng bạn cần lưu trữ các giá trị phát ra trong danh sách và kiểm tra.

Tôi hy vọng điều đó sẽ hữu ích.

3

Bạn có thể làm điều này với groupByUntil để về cơ bản debounce từng mục

o 
    .groupByUntil(x => x, x => x, x => Observable.timer(1000)) 
    .flatMap(grp => grp.first()) 
+0

Đó là cách tôi sẽ làm. –

+0

Có vẻ tốt cho RxJS - RxJava2 dường như không có nhà điều hành groupByUntil, bắn :) –

+0

yeah đã không chắc chắn lý do tại sao bạn liệt kê cả rxjs và rx-java. Bạn có thể thử chuyển phiên bản C# sang Java: https://github.com/Reactive-Extensions/Rx.NET/blob/83710cfa9395355af6eb908f96261ea632a49009/Rx.NET/Source/src/System.Reactive/Linq/Observable/GroupByUntil.cs – Brandon

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