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
Trả lời
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
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.
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())
Đó là cách tôi sẽ làm. –
Có vẻ tốt cho RxJS - RxJava2 dường như không có nhà điều hành groupByUntil, bắn :) –
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
- 1. Ngăn chặn ánh xạ một phần đường bờ biển
- 2. Tại sao Ánh xạ bất ngờ xảy ra trong AutoMapper?
- 3. Vô tình phát hành mã để sống. Làm thế nào để ngăn chặn xảy ra một lần nữa?
- 4. Phát hiện tràn ngăn xếp trong thời gian chạy trước
- 5. Sử dụng phản xạ Scala với phản xạ Java
- 6. NSDateFormatter mili giây lỗi
- 7. Làm thế nào để phát hiện nếu một ký tự Unicode ánh xạ tới hình vuông thiếu biểu tượng?
- 8. XhrRequest với phản xạ/phản xạ-dom
- 9. đồng bộ hóa với, xảy ra trước khi mối quan hệ và ngữ nghĩa phát hành thu được
- 10. Hiển thị mili giây trong Excel
- 11. Cách chuyển đổi mili giây thành giây.
- 12. Hiển thị dateiff là giây, mili giây
- 13. jQuery làm thế nào để làm cho sự kiện xảy ra mỗi x giây?
- 14. NSTimer Giảm thời gian bằng giây/mili giây
- 15. CURRENT_TIMESTAMP tính bằng mili giây
- 16. Java Mili giây trong năm
- 17. timestamp Nhận bao gồm mili giây
- 18. Phương thức gọi sau 5 mili giây
- 19. Dấu vết ngăn xếp sử dụng ánh xạ nguồn
- 20. M-x xảy ra ngay lập tức
- 21. Haskell Time loại nắm giữ mili giây
- 22. XMLTimeToDateTime bỏ qua mili giây
- 23. Java Ngày đến mili giây
- 24. Hive from_unixtime cho mili giây
- 25. Tính mili giây từ epoch
- 26. Ray Tracing: Chỉ sử dụng tia đơn thay vì cả tia phản xạ và khúc xạ
- 27. Chức năng đo MFC theo mili giây
- 28. Làm thế nào để ngăn chặn hàng loạt cửa sổ đóng khi xảy ra lỗi?
- 29. RxJava- CombineLatest nhưng chỉ cháy cho một phát xạ của Observable?
- 30. Điều gì xảy ra với đoạn mã bên dưới trong bản dựng bản phát hành?
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? –