ngx-rxjs-zone-scheduler
TypeScript icon, indicating that this package has built-in type declarations

17.1.0 • Public • Published

ngx-rxjs-zone-scheduler

A library for Angular providing rxjs schedulers to run some kind of work inside or outside of NgZone.

Purpose

Sometimes in Angular you need to decide if a task should run inside or outside of NgZone. Usually this is possible by injecting NgZone:

import { Component, inject, NgZone, OnInit } from '@angular/core';

@Component({
  // ...
})
export class AppComponent implements OnInit {
  private ngZone = inject(NgZone);

  ngOnInit() {
    this.ngZone.run(() => {
      /* run inside NgZone */
    });
    this.ngZone.runOutsideAngular(() => {
      /* run outside NgZone */
    });
    // ...
  }
}

This is a simple library to wrap this functionality into a rxjs scheduler in order to use it directly with rxjs Observable.

Installation

npm install ngx-rxjs-zone-scheduler --save or yarn add ngx-rxjs-zone-scheduler

Usage

Provide RxNgZoneScheduler via provideRxNgZoneScheduler() in your applicationConfig or main.ts:

import { ApplicationConfig } from '@angular/core';
import { provideRxNgZoneScheduler } from 'ngx-rxjs-zone-scheduler';
// ...
providers: [
  // ...
  provideRxNgZoneScheduler(),
];
// ...

Now you can inject RxNgZoneScheduler in your services or components:

import { Component, inject, OnInit } from '@angular/core';
import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';

import { RxNgZoneScheduler } from 'ngx-rxjs-zone-scheduler';

@Component({
  // ...
})
export class AppComponent implements OnInit {
  public demotext1$: Observable<string>;
  public demotext2$: Observable<string>;
  public demotext3$: Observable<string>;
  public demotext4$: Observable<string>;

  private zoneScheduler = inject(RxNgZoneScheduler);

  ngOnInit() {
    // Usage of pipeable operators as wrappers for observeOn and subscribeOn:

    this.demotext1$ = of('This is the initial text').pipe(
      this.zoneScheduler.observeOutOfNgZone() // To observe outside of NgZone - like runOutsideAngular()
    );

    this.demotext2$ = of('This is the initial text').pipe(
      this.zoneScheduler.observeOnNgZone() // To observe inside of NgZone - like run()
    );

    // Direct usage of the scheduler:
    this.demotext3$ = of('This is the initial text').pipe(
      delay(100, this.zoneScheduler.leaveNgZone()) // To produce outside of NgZone - like runOutsideAngular()
    );

    this.demotext4$ = of('This is the initial text').pipe(
      delay(100, this.zoneScheduler.enterNgZone()) // To produce inside of NgZone - like run()
    );
  }

  // ...
}

It is also possible to use the schedulers without importing RxNgZoneSchedulerModule:

import { Component, OnInit, NgZone, inject } from '@angular/core';
import { Observable, of } from 'rxjs';
import { delay, observeOn } from 'rxjs/operators';

import { enterNgZone, leaveNgZone } from 'ngx-rxjs-zone-scheduler';

@Component({
  // ...
})
export class AppComponent implements OnInit {
  public demotext1$: Observable<string>;
  public demotext2$: Observable<string>;

  private ngZone = inject(NgZone);

  ngOnInit() {
    this.demotext1$ = of('This is the initial text').pipe(
      observeOn(enterNgZone(this.ngZone))
    );

    this.demotext2$ = of('This is the initial text').pipe(
      observeOn(leaveNgZone(this.ngZone))
    );
  }

  // ...
}

Package Sidebar

Install

npm i ngx-rxjs-zone-scheduler

Weekly Downloads

18,311

Version

17.1.0

License

MIT

Unpacked Size

27.3 kB

Total Files

13

Last publish

Collaborators

  • ftischler