[英]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.