[英]How can I loop over Callback functions in Java/JavaScript?
我有一本書的清單:
List<Book> books = new ArrayList<Book>();
現在,我將遍歷此列表,對每個對象調用一個函數myFunction()。
for(Book book: books) {
book.myFunction();
}
現在,我有一個Callback接口,當myFunction()完成時會調用該接口:
public interface MyHandler {
void onDone();
}
所以myFunction是這樣的:
public void myFunction(MyHandler handler) {
...
handler.onDone();
}
如何遍歷書籍清單並調用myFunction(MyHandler handler)?
請注意,只有在調用onDone()之后才能繼續。
唯一不合適的是您對myFunction()
調用,這會導致編譯錯誤,因為缺少MyHandler
參數。
您只需MyHandler
myFunction()
方法提供一個實現MyHandler
的對象。 您可以通過這樣的匿名類來做到這一點:
for(Book book: books) {
book.myFunction(new MyHandler() {
void onDone() {
// put some code you want to execute here
}
});
}
旁注:為了后代,在可以使用Java 8的上下文中,您甚至可以使用lambda表達式代替匿名類:
for(Book book: books) {
book.myFunction(() -> { /* insert code for onDone() here */ });
}
由於您已將其標記為GWT,因此我將假設myFunction()
調用實際上是在做異步操作,這就是為什么您不能簡單地等待它返回。 在這種情況下,您可以執行以下操作,盡管有點麻煩:
final Iterator<Book> iter = books.iterator();
MyHandler handler = new MyHandler() {
@Override
public void onDone() {
if (iter.hasNext())
iter.next().myFunction(this);
}
};
//
// Start it going
//
if (iter.hasNext())
iter.next().myFunction(handler);
請注意,這現在是遞歸的 ,因此,如果您有很多書本對象,則調用堆棧會變得很深,這會在堆棧溢出之前對書本數量施加上限(您可以設置一個上限)牛逼可靠地知道 ,無論是)這是沒有這樣的問題,如果您使用的是GWT服務觸發回調,因為stack將解開由於網絡的東西。
我的意思不是在這里猜測您,但是如果您正在調用async gwt服務,那么它將導致通過網絡來回調用。 如果是這種情況,那么您可以考慮簡單地將要處理的Book對象列表傳遞給服務,而不是一次發送一個。
為了避免異步調用,請在服務器上創建一個遍歷書籍的方法,從而避免遞歸調用。 這樣您就可以只進行一次通話過程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.