Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java/JavaScript中循环回调函数?_Java_Javascript_Gwt - Fatal编程技术网

如何在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);