code: public List<V> dispatchAndJoin() {
          List<V> results = new ArrayList<>();
  
          List<V> joinedResults = dispatch().join();
          results.addAll(joinedResults);
          while (this.dispatchDepth() > 0) {
              joinedResults = dispatch().join();
              results.addAll(joinedResults);
          }
          return results;
      }
docs: Normally {@link #dispatch()} is an asynchronous operation but this version will 'join' on the
  results if dispatch and wait for them to complete.  If the {@link CompletableFuture} callbacks make more
  calls to this data loader then the {@link #dispatchDepth()} will be &gt; 0 and this method will loop
  around and wait for any other extra batch loads to occur.
  
  @return the list of all results when the {@link #dispatchDepth()} reached 0