Framework
Version

Abhängige Queries

injectQuery abhängige Abfrage

Abhängige (oder serielle) Abfragen hängen davon ab, dass frühere abgeschlossen sind, bevor sie ausgeführt werden können. Um dies zu erreichen, ist es so einfach wie die Verwendung der Option enabled, um einer Abfrage mitzuteilen, wann sie bereit zur Ausführung ist.

ts
// Get the user
userQuery = injectQuery(() => ({
  queryKey: ['user', email],
  queryFn: getUserByEmail,
}))

// Then get the user's projects
projectsQuery = injectQuery(() => ({
  queryKey: ['projects', this.userQuery.data()?.id],
  queryFn: getProjectsByUser,
  // The query will not execute until the user id exists
  enabled: !!this.userQuery.data()?.id,
}))
// Get the user
userQuery = injectQuery(() => ({
  queryKey: ['user', email],
  queryFn: getUserByEmail,
}))

// Then get the user's projects
projectsQuery = injectQuery(() => ({
  queryKey: ['projects', this.userQuery.data()?.id],
  queryFn: getProjectsByUser,
  // The query will not execute until the user id exists
  enabled: !!this.userQuery.data()?.id,
}))

Die Abfrage projects wird starten in

tsx
status: 'pending'
isPending: true
fetchStatus: 'idle'
status: 'pending'
isPending: true
fetchStatus: 'idle'

Sobald der user verfügbar ist, wird die Abfrage projects enabled und wechselt dann zu

tsx
status: 'pending'
isPending: true
fetchStatus: 'fetching'
status: 'pending'
isPending: true
fetchStatus: 'fetching'

Sobald wir die Projekte haben, geht es weiter zu

tsx
status: 'success'
isPending: false
fetchStatus: 'idle'
status: 'success'
isPending: false
fetchStatus: 'idle'

injectQueries abhängige Abfrage

Dynamische parallele Abfrage - injectQueries kann auch von einer vorherigen Abfrage abhängen. Hier erfahren Sie, wie Sie dies erreichen können

ts
// injectQueries is under development for Angular Query
// injectQueries is under development for Angular Query

Beachten Sie, dass injectQueries ein Array von Abfrageergebnissen zurückgibt

Ein Hinweis zur Leistung

Abhängige Abfragen stellen per Definition eine Form des Request Waterfall dar, was sich negativ auf die Leistung auswirkt. Wenn wir so tun, als ob beide Abfragen gleich lange dauern, dauert die serielle Ausführung doppelt so lange wie die parallele Ausführung, was besonders bei Clients mit hoher Latenz schädlich ist. Wenn möglich, ist es immer besser, die Backend-APIs so umzugestalten, dass beide Abfragen parallel abgerufen werden können, obwohl dies möglicherweise nicht immer praktisch umsetzbar ist.

Im obigen Beispiel würde das Einführen einer neuen Abfrage getProjectsByUserEmail anstelle des ersten Abrufens von getUserByEmail, um getProjectsByUser abrufen zu können, den Wasserfall abflachen.