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