Я сам с этим боролся, и я использовал несколько методов - «цепной» один становится просто уродливым (но его можно улучшить, если вы создадите классы вместо встроенных классов для каждого метода).
Мне подходит вариант вашей собственной версии:
int outstandingCalls = 0;
{
outstandingCalls++;
AjaxLoader.loadApi("books", "0", new Runnable(){
public void run() {
ready();
}}, null);
outstandingCalls++;
AjaxLoader.loadApi("search", "1", new Runnable(){
public void run() {
ready();
}}, null);
outstandingCalls++;
loginService.login(GWT.getHostPageBaseURL(), new AsyncCallback<LoginInfo>() {
public void onSuccess(LoginInfo result) {
ready();
}
// Be sure to decrement or otherwise handle the onFailure
});
}
private void ready() {
if (--outstandingCalls > 0) return;
// Everything loaded
}
Все, что я сделал, это создал счетчик для числа вызовов, которые я собираюсь сделать, затем каждый асинхронный результат вызывает ready()
(обязательно делайте это также на методах сбоя, если вы не собираетесь что-то делать отличается)
В методе ready я уменьшаю счетчик и вижу, есть ли еще ожидающие вызовы.
Это все еще уродливо, но позволяет добавлять звонки по мере необходимости.