Using rxJs Subjects with errors in subscriptions can cause the entire stream to fail

It is a well-known behavior described in this article

The fundamental issue is outlined in the provided link, but below is the relevant code snippet (excerpted from the link)

// This will exhibit unusual behavior
const source$ = Observable.interval(1000).share();
const mapped$ = source$.map(x => {
  if (x === 1) {
    throw new Error('oops');
  }
  return x;
});
source$.subscribe(x => console.log('A', x));
mapped$.subscribe(x => console.log('B', x));
source$.subscribe(x => console.log('C', x));
// "A" 0
// "B" 0
// "C" 0
// "A" 1
// Uncaught Error: "oops"

If an error occurs in a subscription, it will terminate the entire source stream.

The solution for an Observable is to use .observeOn(Rx.Scheduler.asap);

I am new to reactive programming and finding it challenging to apply this solution to my Subject, as subjects do not support observeOn.

However, I require a Subject because I need to add new values to the stream.

How can I overcome this issue or incorporate observeOn with a Subject?

observeOn returns an Observable. However, I am unsure how to integrate observeOn with my Subject. How can I utilize observeOn while still being able to push values to my subject?

Here is the simplified version of my current code

export class MyClass{

    private messages: Subject<Message> = new Subject<Message>();

    dispatchMessage(message: Message) {

     this.messages.next(message);
}

Any ideas?

P.S.

For those using Angular (like myself), observeOn may have unintended side effects. https://github.com/angular/angular/issues/14316

This information is provided as supplementary for future reference.

Answer №1

If this scenario arises, it is essential to create a distinct reference for the Subject and another reference for the subsequent chain following the addition of the observeOn operator:

const mySubject$ = new Subject();
const myObs$ = mySubject$.observeOn(...);

myObs$.subscribe(...);
mySubject$.next(...);

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

How to trigger a function in a separate component (Comp2) from the HTML of Comp1 using Angular 2

--- Component 1--------------- <div> <li><a href="#" (click)="getFactsCount()"> Instance 2 </a></li> However, the getFactsCount() function is located in another component. I am considering utilizing @output/emitter or some o ...

When you compile TypeScript with the target set to 'ES3' or 'ES5', it creates an internal structure

Recently delved into the world of TypeScript and experimenting with webpack ts-loader and babel-loader to compile and transpile TypeScript into ES5. However, I came across a compiler option in tsc that can target 'ES5', which made me question the ...

Implementing ordering and limiting of elements in NestJS TypeORM relations

I am new to typeorm and relationships. I am currently facing some challenges and feeling a bit confused. I have a question regarding sorting relations in typeorm by id or createdDate without explicitly mapping them and limiting the number of elements. Here ...

Using Angular to bind the ngModel to a variable's object property

In my application, I am working with a user object that looks like this: let user = {name: "John", dob:"1995-10-15", metadata: {}} The metadata property of the user object is initially empty. I want to add a new property to the metadata object based on u ...

Invoke a function once a series of functions have finished executing in Angular 8

As a beginner in Angular, I am facing a challenge in calling a function after a series of functions have completed their execution. Although I don't require these functions to run sequentially, I do need to trigger another function once all of these f ...

"Typescript throws a mysterious 'Undefined value' error post-assignment

I'm currently working on a task to fetch my customer's branding information based on their Id using Angular. First, I retrieve all the customer data: this.subscription = this.burstService.getBurst().subscribe(async(response) => { if (r ...

Angular sets the required property only when the button is clicked

Is there a way to make a field required in Angular only when a button is clicked? Currently, the error message appears even before the user interacts with the field. I would like the error message "folder name is required" to only appear when the user cli ...

What sets aws-cdk-lib apart from @aws-cdk/core, @aws-cdk/aws-iam, and others?

There seems to be a variety of examples out there using the AWS CDK, with some referencing aws-cdk-lib and others using @aws-cdk/core. Can someone clarify the distinction between these two and provide guidance on when to use one over the other? ...

Angular functions are self-contained and cannot access anything external to their own scope

I created a classic interceptor for Angular, and now I am working on an interceptor for Syncfusion requests. While I have found a solution, I am facing a problem - I am unable to call a method in my function instance. Here is the snippet of my source code: ...

Exploring the canDeactivateFn syntax with Angular Documentation

As a first-year university student, I recently discovered that the canDeactivate() guard in Angular is deprecated, while the canDeactivateFn guard functions without any issues. Admittedly, navigating through official documentation is still new to me. From ...

Ways to resolve the issue of incompatible parameters 'action' types in JavaScript

I'm encountering a common problem, but I can't figure out why this error is happening. After updating redux, I encountered the following error message: TS2322: Type '(state: ILanguage | undefined, action: PayloadAction<ILanguage>) =&g ...

What is the best way to set State conditionally based on two different objects, each with its own type, without resorting to

I am trying to create two different objects, each with slightly different types, in order for them to be compatible with a state object that contains values of both types. However, I am encountering the following error: Property 'dataA' does no ...

The type checkbox cannot be converted to type number

Currently, the TodoApp is utilizing the Inquirer.js module for questioning purposes. However, an issue has arisen with the error message stating type checkbox is not assignable to type number. function promptComplete(): void{ console.clear(); inq ...

Refreshing the page causes the Angular/Ionic Singleton instance to be destroyed

I have a TypeScript singleton class that is responsible for storing the login credentials of a user. When I set these credentials on the login page and navigate to the next page using Angular Router.navigate (without passing any parameters), everything wor ...

The shift from es6 to commonJs in Angular modules has far-reaching implications

My attempt to incorporate FileSaver into my app led me to use the following command: import filesaver = require('filesaver'); However, this resulted in the error message: Import assignment cannot be used when targeting ECMAScript 2015 module ...

Executing the Ionic code within the Xcode Swift environment

I have developed an Ionic application that I successfully compiled in Xcode for iOS. Additionally, I have integrated a widget into the application. My goal is to set it up so that when the application is opened using the regular app icon, it displays the m ...

Turn off pm2 logging

I have my node app running via pm2 with the following command: pm2 start npm -- start --node-args="--max-old-space-size=1024" My package.json file contains: { "name": "my-app", "version": "1.0.0", &q ...

Tips for invoking a function from one React component to another component

Currently, I am working on two components: one is Game and the other is PickWinner. The Game component serves as the parent component, from which I need to call the pickWinner function in the PickWinner component. Specifically, I want to trigger the startP ...

Here is a method to display a specific string in the mat-datepicker input, while only sending the date in the backend

enter image description hereIn this code snippet, there is a date input field along with a Permanent button. The scenario is that when the Permanent button is clicked, it should display "Permanent" in the input UI (nativeElements value), but the value bein ...

What causes TypeScript to generate an error when using two array of object types, but not when using the shape of both?

There are two basic types of data available: type DataA = { percent: string; exchange: string; }; type DataB = { price: number; exchange: string; }; I'm puzzled as to why TypeScript gives errors when I try to use both types together: const ...