# Angular: NG02100: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'

**Code:** `NG02100` · **Category:** Angular · **Seen on:** Angular, TypeScript

The `async` pipe received a plain object or array instead of an Observable or Promise.

## Meaning

`| async` subscribes to an Observable or Promise. Passing already-resolved data (an array, an object, a string) throws. Remove the pipe for plain values, or make the property an Observable / Promise. A frequent cause is `| async` applied to the result of a `subscribe()` assignment.

## Common causes

- Property holds an array/object, not an Observable or Promise
- Subscribed manually in the component and then used `| async` on the stored value
- Service returns data synchronously in one branch and an Observable in another
- Wrong variable bound (the value vs the `$` stream)
- `*ngIf="user$ | async as user"` where `user$` is already a value

## Quick fix

1. Remove `| async` when the value is plain data
2. Or keep the Observable (`items$ = this.http.get(...)`) and use `| async`
3. Use `of(value)` when a stream is required

## Detailed fix by platform

### Angular

1. Either `items = signal<Item[]>([])` and `@for (i of items(); track i.id)`, or `items$ = this.api.list();` and `@for (i of items$ | async; track i.id)`

## Code examples

### Stream or value, not a mix

```typescript
items$ = this.http.get<Item[]>('/api/items');     // template: @for (i of items$ | async; track i.id)
items: Item[] = [];                                // template: @for (i of items; track i.id)  (no async)

ngOnInit() { this.items$.subscribe(v => (this.items = v)); }   // fine, but then do NOT use | async on `items`
```

## How to diagnose

1. **Type** — Observable, Promise or plain value?
2. **Pipe** — Is async applied to the stream?
3. **Mix** — Manual subscribe plus async?

---
Source: [WhatIsMyError](https://whatismyerror.com/errors/angular/ng02100-invalidpipeargument-asyncpipe)
