簡體   English   中英

如何遍歷Java / JavaScript中的回調函數?

[英]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.

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