Java回调地狱,步数不确定

时间:2018-09-06 15:36:52

标签: java callback

我需要在给定的时间间隔内从服务获取消息。

我向我的服务提出了要求,在此我指定了FROM日期和TO日期。但是该服务从FROM日期开始,直到2000条消息,然后即使没有到达TO日期,也不再向我返回那2000条消息。

因此,如果要获取所有消息,则必须检查每个响应,如果有2000条消息,则需要发出另一个请求,在其中将FROM日期指定为最后一条返回消息的日期。依此类推,直到我到达TO日期为止。

让我们说这个方法看起来像这样:

public void getMessages(Date from, Date to, Callback<List<Message>> onSuccess);

所以我试图这样写:

List<Message> allMessages = new ArrayList<>();
getMessages(fromDate, toDate, messages -> {
   //save all the messages returned
   allMessages.addAll(messages);
   if(messages.size()==2000){
      //get the last message date
      Date nextDate = messages.get(messages.size() - 1).getDateTime();
      //query next messages
      getMessages(nextDate, to, onSuccess); //and here I am screwed in what to put in the onSuccess again...
   }
});

该如何执行才能继续执行一定数量的步骤,或者在最终到达TO日期时停止?我什至可以更改getMessages()方法,但是我是从HTTP请求中获取数据的,因此需要通过Callback来完成。

更新: 感谢您提供所有答案,并根据这些答案提出了一个简单的解决方案。

我创建了这样的方法:

private void checkMessages(List<Message> messages, Date toDate, List<Message> allMessages) {
    // save all the messages returned
    allMessages.addAll(messages);
    if (messages.size() == 2000) {
      // get the last message date
      Date nextDate = messages.get(messages.size() - 1).getDateTime();
      // query next messages
      getMessages(nextDate, toDate,
          msgs -> checkMessages(msgs, toDate, allMessages));
    } else {
      // else we are finished
      messageTable.setMessages(allMessages);
    }
  }

,并且我在回调中使用了此方法:

List<Message> allMessages = new ArrayList<>();
getMessages(fromDate, toDate,
        messages -> checkMessages(messages, toDate, allMessages));

这绝对不是理想的选择,但似乎可行。

2 个答案:

答案 0 :(得分:0)

怎么样?

git config --global http.proxy http://proxyUsername:proxyPassword@aaa.ccc.com:port

答案 1 :(得分:0)

您可以使用Predicate而不是回调,来决定是否需要拨打另一个电话。

我在这里演示带有线程的异步服务调用。 1 。这可能对您不起作用。如果您可以向我们展示一旦服务返回响应,您如何调用回调,那将更有帮助。

public void getMessages(Date from, Date to, Predicate<List<Message>> shouldMakeAnotherCall) {
    new Thread(() -> {
        List<Message> messages = //Call service
        if (shouldMakeAnotherCall.apply(messages)) {
            getMessages(from, to, shouldMakeAnotherCall);
        }   
    }).start();
}

Predicate<List<Message>> shouldMakeAnotherCall = listOfMessages -> listOfMessages.size() == 2000;

getMessages(from, to, shouldMakeAnotherCall);

1 这会进行后续调用,每个调用都会创建一个新线程,因此效果不佳。