24 Jul 2024
5 min

delay – RxJS Reference

delay

delay time shifts each emitted value from the source observable by a defined time span or until a given date. If the delay argument is a Number, this operator time shifts the source observable by that amount of time expressed in milliseconds. If the delay argument is a Date, delay starts emitting all incoming values until that point at the date specified preserving the intervals between the values.

Note that delay preserves the relative time intervals between the values. It means that if the source observable emits 3 items synchronously, all 3 of them will be delayed by a certain amount of time but delivered synchronously with a minimum time span between them. The time span will be equal or very close to the time span between the values emitted by the source obsevable. This is in contrast to how interval operator works, which inserts delays in between the values.

delay operator works in the following way:

  1. Subscribe to a source observable
  2. When a new value arrives from a source observable, add the value to internal cache and start a delay interval for that value
  3. Once the interval elapses, send the corresponding value to the observer
  4. Once the source observable completes, send the complete notification to the observer
  5. If the source observable throws an error, send the error notification to the observer

By default, the operator uses setInterval through AsyncScheduler under the hood for scheduling.

Usage

delay is commonly used to mock some asynchronous activity, such as network requests.

Here’s an example that demonstrates how to simulate network latency with 3 requests:

const api = 'https://reqres.in/api/users/';
const urls = [1, 2, 3].map(id => api + id);

from(urls).pipe(
   mergeMap(url => mockHTTPRequest(url))
).subscribe(val => console.log(val));

function mockHTTPRequest(url) {
   return of(`Response from ${url}`).pipe(
       // responses come in a random order
       delay(Math.random() * 1000)
   );
}

Playground

Additional resources

See also

Share this post

Sign up for our newsletter

Stay up-to-date with the trends and be a part of a thriving community.