code: public RequestFuture<?> forEachAsync(final Procedure<T> action)
      {
          return forEachAsync(action, (throwable) ->
          {
              if (RestAction.DEFAULT_FAILURE != null)
                  RestAction.DEFAULT_FAILURE.accept(throwable);
          }
docs: Iterates over all entities until the provided action returns {@code false}!
  <br>This operation is different from {@link #forEach(Consumer)} as it
  uses successive {@link #queue()} tasks to iterate each entity in callback threads instead of
  the calling active thread.
  This means that this method fully works on different threads to retrieve new entities.
  <p><b>This iteration will include already cached entities, in order to exclude cached
  entities use {@link #forEachRemainingAsync(Procedure)}</b>
  
  <h1>Example</h1>
  <pre>{@code
  //deletes messages until it finds a user that is still in guild
  public void cleanupMessages(MessagePaginationAction action)
  {
  action.forEachAsync( (message) ->
  {
  Guild guild = message.getGuild();
  if (!guild.isMember(message.getAuthor()))
  message.delete().queue();
  else
  return false;
  return true;
  });
  }
  }</pre>
  
  @param  action
  {@link net.dv8tion.jda.core.utils.Procedure Procedure} returning {@code true} if iteration should continue!
  
  @throws java.lang.IllegalArgumentException
  If the provided Procedure is {@code null}
  
  @return {@link java.util.concurrent.Future Future} that can be cancelled to stop iteration from outside!