繁体   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