如何在Java/JavaScript中循环回调函数?
我有一个书单:如何在Java/JavaScript中循环回调函数?,java,javascript,gwt,Java,Javascript,Gwt,我有一个书单: List<Book> books = new ArrayList<Book>(); 现在,我有一个回调接口,在myFunction完成时调用该接口: public interface MyHandler { void onDone(); } 所以myFunction类似于: public void myFunction(MyHandler handler) { ... handler.onDone(); } 如何遍历书籍列表并调用
List<Book> books = new ArrayList<Book>();
现在,我有一个回调接口,在myFunction完成时调用该接口:
public interface MyHandler {
void onDone();
}
所以myFunction类似于:
public void myFunction(MyHandler handler) {
...
handler.onDone();
}
如何遍历书籍列表并调用myFunctionMyHandler
请注意,只有在调用onDone后才能继续 唯一不合适的是调用myFunction,这会导致编译错误,因为缺少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);
请注意,这是递归的,因此如果您有很多book对象,那么调用堆栈将变得相当深,这会在溢出堆栈之前对书籍的数量施加一个上限—一个无法达到的上限,如果您使用GWT服务触发回调,这也不是问题,由于网络问题,堆栈将展开
我不想在这里猜测你,但是如果你调用一个异步gwt服务,那么它将导致在网络上来回大量调用。如果是这种情况,那么你可以考虑简单地把要处理的书本对象列表传递给服务,而不是一次发送一个。 < P>避免异步调用,在服务器上创建一个方法,通过书本循环,从而避免调用调用。所以你只需要打一个电话就可以了。我的书都在这里了,有什么问题吗?@Joffrey你能举个例子吗。纠正我,我错了。您想在上一个图书项目的onDone完成后处理下一个图书项目一次。您只能在调用或完成onDone后继续吗?请确认。您不能使用lambda表达式,因为到目前为止GWT只支持Java 7。@Baz我的错,我没有看到GWT标记。
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);