diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java index 479f5afca9..6a9ddb5fe5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java @@ -108,6 +108,15 @@ public class CallbackGroup { } } + private void applyAllFailed() { + if (failed && finalAdded && remaining.isEmpty()) { + for (CallbackImpl cb : callbacks) { + cb.applyFailed(); + } + callbacks.clear(); + } + } + private Callback handleAdd(AsyncCallback cb) { if (failed) { cb.onFailure(failedThrowable); @@ -140,10 +149,6 @@ public class CallbackGroup { @Override public void onSuccess(T value) { - if (failed) { - return; - } - this.result = value; remaining.remove(this); CallbackGroup.this.applyAllSuccess(); @@ -151,19 +156,12 @@ public class CallbackGroup { @Override public void onFailure(Throwable caught) { - if (failed) { - return; + if (!failed) { + failed = true; + failedThrowable = caught; } - - failed = true; - failedThrowable = caught; - for (CallbackImpl cb : callbacks) { - cb.delegate.onFailure(failedThrowable); - cb.delegate = null; - cb.result = null; - } - callbacks.clear(); - remaining.clear(); + remaining.remove(this); + CallbackGroup.this.applyAllFailed(); } void applySuccess() { @@ -174,5 +172,14 @@ public class CallbackGroup { result = null; } } + + void applyFailed() { + AsyncCallback cb = delegate; + if (cb != null) { + delegate = null; + result = null; + cb.onFailure(failedThrowable); + } + } } }