簡體   English   中英

Java回調地獄,步數不確定

[英]Java callback hell with uncertain number of steps

我需要在給定的間隔內從服務獲取消息。

我向我的服務提出了要求,並在其中指定“開始日期”和“結束日期”。 但是該服務從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));

這絕對不是理想的,但似乎正在起作用。

這個怎么樣?

    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這會進行后續調用,每個調用都會創建一個新線程,因此效果不佳。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM