What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Angular error NG0991 means an Observable-backed resource completed without emitting a value or an error. Find and fix the upstream empty completion: let the error reach the resource, emit a suitable fallback, or correct HTTP handling that swallowed the response.
What NG0991 means
Angular’s NG0991 error guidance describes a resource that finished without giving Angular either a value to expose or an error to report. A resource cannot resolve from a silent completion.
The failure may become visible when code reads the resource, but the cause is usually upstream: the Observable ended without emitting. Angular’s RxResourceOptions API requires the stream Observable to emit a value or an error before it completes. As Angular puts it, “This Observable must eventually emit a value or an error before it completes — a resource needs one of those two things to know what to show.”
Where to look first
With rxResource: inspect the stream Observable
Check the Observable returned by the stream function, including its error handlers and any operators that combine streams. One common cause is swallowing an error by returning RxJS EMPTY:
#1 Best Overall
catchError(() => EMPTY)
EMPTY completes without emitting. That leaves the resource with neither a value nor an error, producing NG0991. Also check merge, race, and similar combinations: depending on their inputs, a combined Observable can complete before any input emits.
With httpResource: inspect interceptors and response handling
httpResource creates its HTTP request internally, so start by checking the code between the request and the response—especially interceptors. An interceptor that catches an error and returns EMPTY can turn a failed request into a silent completion. Angular’s HTTP resource guidance identifies swallowed HTTP errors as a cause to investigate; the implementation reports a runtime error if the request completes before a response resolves the resource.
Rank #2
Choose the intended outcome
Let the resource enter its error state
If the failure should be visible as an error, do not consume it with a handler that returns EMPTY. Let the error propagate to the resource; consumers can inspect error().
Emit a fallback when that matches the data contract
If the UI should resolve with a fallback instead, return an Observable that emits a real value. For example, catching an error and returning of(null) emits null; use this only if null is a valid fallback for the resource’s data contract. A fallback emission resolves the resource with that value rather than silently completing.
Rank #3
Fix HTTP handling that swallows the result
Adjust an interceptor or other upstream HTTP handler to forward the response or propagate the error. If the application intentionally substitutes a response, return an actual response value instead of an empty completion.
Read resource values defensively
When empty completion may originate in code outside the component you control, check the resource state before calling value(). Use hasValue() or inspect status() to avoid reading a value that is not available. This guards consumers; it does not replace fixing the upstream completion that causes NG0991.
Rank #4
How rxResource and httpResource differ when debugging
| Resource | Where the Observable comes from | Where to inspect first |
|---|---|---|
rxResource |
The application’s stream function |
Stream operators, error handling, and combined Observables |
httpResource |
An HTTP request created internally | Interceptors and other HTTP response-handling layers |
For either resource, decide whether the intended result is a propagated error or an emitted fallback. Angular describes resources as asynchronous dependencies exposed through signals. Its resource API is intended for reads and can cancel in-progress loads when a resource is destroyed or a new request becomes available, so it is not appropriate for mutations that must not be interrupted.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




