subprojects/parseq/src/main/java/com/linkedin/parseq/internal/InternalUtil.java
public static void after(final PromiseListener<?> listener, final Promise<?>... promises) {
    final SettablePromise<Object> afterPromise = Promises.settable();
    final PromiseListener<Object> countDownListener =
        new CountDownPromiseListener<Object>(promises.length, afterPromise, null);

    for (Promise<?> promise : promises) {
      unwildcardPromise(promise).addListener(countDownListener);
    }

    afterPromise.addListener(unwildcardListener(listener));
  }
public static void after(final PromiseListener<?> listener, final Promise<?>... promises) {
    final SettablePromise<Object> afterPromise = Promises.settable();
    final PromiseListener<Object> countDownListener =
        new CountDownPromiseListener<Object>(promises.length, afterPromise, null);

    for (Promise<?> promise : promises) {
      unwildcardPromise(promise).addListener(countDownListener);
    }

    afterPromise.addListener(unwildcardListener(listener));
  }
Invokes the {@code listener} once all given {@code promises} have been resolved.

@param listener the listener to invoke when the promises have finished.
@param promises the set of promises that must be resolved

@see com.linkedin.parseq.promise.PromiseListener