Java回调地狱,步骤数不确定



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

我向我的服务提出请求,其中我指定了"开始日期"和"结束日期"。但是该服务从 FROM 日期开始,最多 2000 条消息,然后它向我返回这 2000 条消息,即使未达到 TO 日期,也不会再返回。

因此,如果我想获取所有消息,我必须检查每个响应,如果有 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请求中获取数据,因此需要通过回调来完成。

更新:感谢您的所有答案,基于它们,我想出了一个简单的解决方案。

我创建了一个这样的方法:

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));

这绝对不理想,但它似乎正在起作用。

这个怎么样?

List<Message> allMessages = new ArrayList<>();
Callback<List<Message>> onSuccessCallback = 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, toDate, onSuccessCallback);
}
};
getMessages(fromDate, toDate, onSuccessCallback);

您可以有一个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这会使后续调用,其中每个调用创建一个新线程,因此不是一个很好的调用。

最新更新