簡體   English   中英

多次調用相同方法時取消方法調用

[英]Cancelling method calls when the same method is called multiple time

我想這里可能有一個名字,但我不知道。 所以我的第一個問題是要知道這種技術的名稱。

這是一個例子:假設您正在網頁上實施實時搜索。 每次用戶在搜索框中鍵入內容時,您都會觸發新的搜索查詢,並且會盡可能頻繁地更新結果。 這是一個愚蠢的事情,因為你會發送比實際需要更多的查詢。 每2-3個字母發送一次請求或每100毫秒發送一次請求可能就足夠了。

因此,一種技術是在鍵入鍵后立即執行查詢,如果仍有計划但未執行的查詢,則取消它們,因為它們現在已經過時了。


現在更具體地說,是否有特定的模式或庫來解決Java中的這個問題?

我必須在Swing應用程序中解決問題,並且我使用了ExecutorService,它返回了我可以取消的ScheduledFutures。 問題是我必須手動為我想要“緩沖”的每個方法調用創建一個Runnable,並跟蹤每個Future以取消它。

我確定我不是第一個實現這樣的東西的人,所以某處必須有可重復使用的解決方案? 可能是Spring中有注釋和代理的東西?

鑒於其他答案,並經過一些搜索,似乎確實沒有庫可以做我想要的。

我創建了一個並將其放在GitHub上。 這個問題的未來讀者可能會發現它很有趣。

https://github.com/ThomasGirard/JDebounce

我不認為這是非常好的,但至少它是有效的,可以用聲明的方式使用:

@Debounce(delayMilliseconds = 100)
public void debouncedMethod(int callID, DebounceTest callback) { }

你需要什么稱為去抖動 你應該檢查jQuery Throttle / Debounce插件 (除了使用相同的命名空間之外,它完全獨立於jQuery)。 去抖部分涵蓋了你需要的東西:

使用jQuery throttle / debounce,你可以將延遲和函數傳遞給$.debounce來獲得一個新函數,當重復調用時,每次“一堆”調用只執行一次原始函數,有效地將多個順序調用合並為一次執行在開頭或結尾。

Underscore.js具有相同的方法:

_.debounce(function, wait, [immediate]) 

創建並返回傳遞函數的新debounced版本,該函數將推遲執行,直到自上次調用之后經過wait毫秒。 用於實現僅在輸入停止到達后才會發生的行為。 例如:呈現Markdown注釋的預覽,在窗口停止調整大小后重新計算布局,等等。

// example: debounce layout calculation on window resize
var lazyLayout = _.debounce(calculateLayout, 300);
$(window).resize(lazyLayout);

[編輯]

我錯誤地讀了“Javascript”而不是Java。 實際的Java解決方案之后由OP編寫

如果不使用像執行程序和期貨那樣的額外基礎結構,這在Java中是無法解決的。 在Java中以語法簡潔的方式解決這個問題是不可能的。

您將始終需要某種方法結果包裝器,因為該機制立即返回,但實際結果將在以后檢索。 在你的情況下,這是通過Future完成的。

您將始終需要能夠以允許延遲執行的方式指定要執行的代碼。 在大多數語言中,這是使用函數指針或函數值或閉包來完成的。 在Java中,缺少這些語言特性,這通常是通過傳遞實現某種接口的對象來實現的,例如Runnable,Callable,它允許延遲執行代碼塊。 還有其他選項,但它們都不簡單,例如使用動態代理。

TL;博士

不能在Java中以簡潔的方式做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM