【问题标题】:How can I loop over Callback functions in Java/JavaScript?如何循环使用 Java/JavaScript 中的回调函数?
【发布时间】:2014-04-17 11:42:44
【问题描述】:

我有一个书单:

List<Book> books = new ArrayList<Book>();

现在我将遍历这个列表并在每个对象上调用一个函数 myFunction()。

for(Book book: books) {

  book.myFunction();

}

现在,我有一个回调接口,它会在 myFunction() 完成时调用:

public interface MyHandler {
  void onDone();
}

所以 myFunction 类似于:

public void myFunction(MyHandler handler) {

   ...
   handler.onDone();

}

如何遍历书籍列表并调用 myFunction(MyHandler handler)?

请注意,您只能在调用 onDone() 后继续。

【问题讨论】:

  • 好吧,你什么都有了,有什么问题?
  • @Joffrey 能否请您发布一个示例。
  • 纠正我我错了。您希望在完成最后一个 Book 项目的 onDone() 后处理下一个 Book 项目。
  • 只有在onDone()被调用或完成后才能继续?请确认。

标签: java javascript gwt


【解决方案1】:

唯一不适合的是您对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 */ });
}

【讨论】:

  • 你不能使用 lambda 表达式,因为 GWT 目前只支持 Java 7。
  • @Baz 糟糕,我没有看到 GWT 标签。
【解决方案2】:

由于您已将其标记为 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);

注意这现在是递归的,所以如果你有很多书对象,调用堆栈会变得很深,这会在你溢出之前对书的数量施加上限堆栈(您不能reliably know 的上限)如果您使用GWT 服务来触发回调,这不是一个问题,因为堆栈将由于网络问题而展开。

我不想在这里对您进行第二次猜测,但是如果您正在调用异步 gwt 服务,那么它将导致通过网络来回调用大量调用。如果是这种情况,那么您可以考虑简单地将要处理的 Book 对象列表传递给服务,而不是一次发送一个。

【讨论】:

    【解决方案3】:

    为了避免异步调用,请在服务器上创建一个循环遍历书籍的方法,从而避免递归调用。所以你可以只打一个电话 processMybooks(Books)

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2017-06-02
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多