src/main/java/io/reactivex/Observable.java
@CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final <U> Observable<T> delay(final Function<? super T, ? extends ObservableSource<U>> itemDelay) {
        ObjectHelper.requireNonNull(itemDelay, "itemDelay is null");
        return flatMap(ObservableInternalHelper.itemDelay(itemDelay));
    }
@CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final <U> Observable<T> delay(final Function<? super T, ? extends ObservableSource<U>> itemDelay) {
        ObjectHelper.requireNonNull(itemDelay, "itemDelay is null");
        return flatMap(ObservableInternalHelper.itemDelay(itemDelay));
    }
Returns an Observable that delays the emissions of the source ObservableSource via another ObservableSource on a
per-item basis.
<p>
<img width="640" height="450" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/delay.o.png" alt="">
<p>
<em>Note:</em> the resulting ObservableSource will immediately propagate any {@code onError} notification
from the source ObservableSource.
<dl>
<dt><b>Scheduler:</b></dt>
<dd>This version of {@code delay} does not operate by default on a particular {@link Scheduler}.</dd>
</dl>

@param <U>
the item delay value type (ignored)
@param itemDelay
a function that returns an ObservableSource for each item emitted by the source ObservableSource, which is
then used to delay the emission of that item by the resulting ObservableSource until the ObservableSource
returned from {@code itemDelay} emits an item
@return an Observable that delays the emissions of the source ObservableSource via another ObservableSource on a
per-item basis
@see <a href="http://reactivex.io/documentation/operators/delay.html">ReactiveX operators documentation: Delay</a>