Are Angular Signals replacing RxJS in modern Angular applications?
Not really.
Angular Signals and RxJS solve different reactive programming problems. Signals are particularly useful for reactive state and UI interactions, while RxJS remains a strong choice for asynchronous streams, event processing, cancellation, retries, and time-based workflows.
For enterprise Angular applications, the better question isn't:
Signals or RxJS?
It's:
Where should Signals be used, and where does RxJS provide more value?
In many real-world applications, the answer is both.
Angular Signals for Reactive State
Signals are a good fit when you need to represent state that directly affects the UI.
For example:
import { signal, computed } from '@angular/core';
const selectedCategoryId = signal<number>(101);
const firstName = signal('John');
const lastName = signal('Doe');
const fullName = computed(() => `${firstName()} ${lastName()}`);
Here, fullName automatically reacts to changes in firstName or lastName.
Signals work particularly well for:
- Component state
- Selected values
- UI toggles
- Filters
- Counters
- Derived values
- Visibility conditions
- Synchronous reactive state
If the problem is primarily "this state changes, and the UI needs to react", Signals are often a clean solution.
RxJS for Asynchronous Streams
RxJS becomes more valuable when you're dealing with values or events moving through time.
Typical examples include:
- HTTP requests
- Search and autocomplete
- WebSocket streams
- Complex event processing
- Request cancellation
- Retries
- Error recovery
- Debouncing
- Throttling
- Time-based workflows
- Combining multiple asynchronous sources
Consider a search box.
A typical enterprise search flow might need to:
- Wait until the user stops typing.
- Ignore duplicate searches.
- Cancel the previous request.
- Send the latest request.
- Handle the API response.
- Recover from errors.
RxJS is designed for this type of workflow.
For example:
searchTerms$
.pipe(
debounceTime(300),
distinctUntilChanged(),
switchMap(term => this.searchService.search(term))
)
.subscribe(results => {
this.results.set(results);
});
The exact implementation can vary, but the important point is that RxJS provides operators for composing asynchronous behavior.
Signals and RxJS Can Work Together
One of the most useful patterns in modern Angular applications is not replacing RxJS with Signals, but using them together.
A simplified architecture might look like this:
API / Events
↓
RxJS
↓
Application State
↓
Signals
↓
UI
For example, RxJS can handle the API workflow while Signals represent the state consumed by the UI.
readonly users = signal<User[]>([]);
readonly loading = signal(false);
readonly selectedUserId = signal<number | null>(null);
The API layer might still use RxJS:
this.userService.getUsers()
.subscribe(users => {
this.users.set(users);
});
Now the UI can consume the state through Signals without forcing every part of the application to use the same reactive abstraction.
Signals vs RxJS: A Simple Rule
A practical way to decide is to look at the responsibility.
Use Signals when you need:
- Reactive UI state
- Component-level state
- Derived values
- Filters and selections
- Synchronous state changes
- UI-driven interactions
Use RxJS when you need:
- Asynchronous streams
- API workflows
- Event composition
- Cancellation
- Retries
- Debouncing
- WebSockets
- Time-based operations
Use Both when you need:
- Asynchronous data processing and
- Reactive UI state
This approach avoids forcing one technology into every part of the application.
Should You Replace Existing RxJS Code?
For enterprise applications, probably not just for the sake of adopting Signals.
Large Angular codebases may already have extensive RxJS usage across:
- Services
- HTTP workflows
- State management
- Event processing
- WebSocket integrations
- Shared application logic
Rewriting working code simply because Signals are newer can introduce unnecessary migration costs.
A more practical approach is incremental adoption.
Use Signals where they simplify new UI and state management.
Keep RxJS where asynchronous streams and complex workflows already benefit from it.
A Real-World Enterprise Example
Consider a financial dashboard.
The application might need to:
- Retrieve data from several APIs
- Cancel outdated requests
- Retry failed requests
- Combine asynchronous responses
- Track loading states
- Apply filters
- Display calculated values
- Update multiple UI components
RxJS can handle the asynchronous data flow.
Signals can represent UI-facing state such as:
selectedAccount
activeFilter
loading
dashboardData
totalValue
This separation can make the architecture easier to reason about.
For enterprise applications, especially those handling complex financial workflows, this distinction between data streams and UI state can be valuable.
The Enterprise Angular Perspective
The goal shouldn't be to standardize everything around Signals or everything around RxJS.
Instead, establish clear architectural boundaries.
A useful guideline is:
Signals → State
RxJS → Streams
That isn't an absolute rule. There will always be cases where the two overlap.
But it provides a practical starting point when designing or modernizing an Angular application.
Final Takeaway
Angular Signals and RxJS aren't competing technologies that require you to choose a winner.
They solve different problems.
Use Signals for reactive state and UI-driven interactions.
Use RxJS for asynchronous streams, event workflows, cancellation, retries, and time-based operations.
And when your feature requires both, use both.
The better architectural question is not:
"Should we use Signals or RxJS?"
It's:
"What responsibility does each reactive tool own?"
That distinction can help enterprise Angular teams build applications that are easier to understand, maintain, and scale.
Further Reading
I've covered the differences and practical decision-making in more detail here:
Angular Signals vs RxJS: When to Use Each in Enterprise Angular Applications
If you're building or modernizing an enterprise Angular application, you can also explore custom software development solutions and ConvergeSol's financial services technology solutions.
How is your team using Angular Signals and RxJS together?
Are you gradually introducing Signals into an existing RxJS-based application, or are you using both from the beginning?
Share your approach in the comments.
Top comments (0)