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.
// 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
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
status: 'pending'
isPending: true
fetchStatus: 'fetching'
status: 'pending'
isPending: true
fetchStatus: 'fetching'
Sobald wir die Projekte haben, geht es weiter zu
status: 'success'
isPending: false
fetchStatus: 'idle'
status: 'success'
isPending: false
fetchStatus: 'idle'
Dynamische parallele Abfrage - injectQueries kann auch von einer vorherigen Abfrage abhängen. Hier erfahren Sie, wie Sie dies erreichen können
// injectQueries is under development for Angular Query
// injectQueries is under development for Angular Query
Beachten Sie, dass injectQueries ein Array von Abfrageergebnissen zurückgibt
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.