T
TanStack3d ago
continuing-cyan

How to combine two TanStack Query results into a single object in Angular?

I have two separate queries using @tanstack/angular-query:
roles = injectQuery(() => ({
enabled: this.user.data(),
queryKey: ['roles'],
queryFn: () =>
lastValueFrom(getRoles({ roles: this.user.data().roles })),
}));

user = injectQuery(() => ({
queryKey: ['user'],
queryFn: () => lastValueFrom(getUser()),
}));
roles = injectQuery(() => ({
enabled: this.user.data(),
queryKey: ['roles'],
queryFn: () =>
lastValueFrom(getRoles({ roles: this.user.data().roles })),
}));

user = injectQuery(() => ({
queryKey: ['user'],
queryFn: () => lastValueFrom(getUser()),
}));
I want to keep these queries separate, but in the UI I want to consume them as one combined object, e.g.:
<div *ngIf="user.data() as user">
roles: {{ user.roles.length }}
</div>
<div *ngIf="user.data() as user">
roles: {{ user.roles.length }}
</div>
Ideally something like:
userActive = injectQueries(() => ({
queries: [this.user, this.roles],
select: (user, roles) => this.toUser(user, roles),
}));

toUser(user, roles) {
return { ...user, roles: roles };
}
userActive = injectQueries(() => ({
queries: [this.user, this.roles],
select: (user, roles) => this.toUser(user, roles),
}));

toUser(user, roles) {
return { ...user, roles: roles };
}
But I can't figure out how to combine the results like this. I also tried a computed signal, but computed() returns null until both queries load, and I'd prefer to stay within the TanStack Query API:
activeUser = computed(() => {
const user = this.user.data();
const roles = this.roles.data();
if (!user) return;
if (!roles) return;

return this.toUser(user, roles);
});
activeUser = computed(() => {
const user = this.user.data();
const roles = this.roles.data();
if (!user) return;
if (!roles) return;

return this.toUser(user, roles);
});
Is there a built-in way in TanStack Query for Angular to derive/merge the results of two queries into one object (similar to injectQueries + select), while still keeping both queries independent?
0 Replies
No replies yetBe the first to reply to this messageJoin

Did you find this page helpful?