步数不确定的Java回调地狱

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


我向我的服务提出请求,在那里我指定了 FROM 日期和 TO 日期。但是该服务从 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));

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


米琪卡哇伊
浏览 137回答 2
2回答

猛跑小猪

除了回调,您还可以使用 一个Predicate来决定是否需要再次拨打电话。我在这里1演示了带有 Thread 的异步服务调用。这可能适合您,也可能不适合。如果您能向我们展示在服务返回响应后如何调用回调,将会更有帮助。public void getMessages(Date from, Date to, Predicate<List<Message>> shouldMakeAnotherCall) {&nbsp; &nbsp; new Thread(() -> {&nbsp; &nbsp; &nbsp; &nbsp; List<Message> messages = //Call service&nbsp; &nbsp; &nbsp; &nbsp; if (shouldMakeAnotherCall.apply(messages)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getMessages(from, to, shouldMakeAnotherCall);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; }).start();}Predicate<List<Message>> shouldMakeAnotherCall = listOfMessages -> listOfMessages.size() == 2000;getMessages(from, to, shouldMakeAnotherCall);1这使得后续调用每个都创建一个新线程,因此不是一个很好的调用。

不负相思意

这个怎么样?&nbsp; &nbsp; List<Message> allMessages = new ArrayList<>();&nbsp; &nbsp; Callback<List<Message>> onSuccessCallback = messages -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//save all the messages returned&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;allMessages.addAll(messages);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(messages.size()==2000){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //get the last message date&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Date nextDate = messages.get(messages.size() - 1).getDateTime();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //query next messages&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getMessages(nextDate, toDate, onSuccessCallback);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; };&nbsp; &nbsp; getMessages(fromDate, toDate, onSuccessCallback);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java