Ich verwende den Apollo-Client, um auf Graphql-Abfragen zu reagieren. Jetzt habe ich ein Problem, dass, während ich useLazyQuery-Hook verwende, um programmgesteuert abzufragen, aber onCompleted-Rückruf nicht ausgelöst wird, wenn ich zum zweiten Mal abfrage, ob die Netzwerkanforderung tatsächlich abgeschlossen ist und der Status im 1-Index des Rückgabewerts dieses Hooks wird aktualisiert
const [getUser, getUserStatus] = useLazyQuery(GET_USER, {
fetchPolicy: 'no-cache',
notifyOnNetworkStatusChange: true,
// this callback is not triggering 2nd call of getUser
onCompleted: (data) => {
const { customerCart, customer } = data;
if (!id) {
dispatch(updateCartId(customerCart.id));
}
if (id!== customerCart.id) {
mergeCart({
variables: { cartId: id, cartIdToMerge: customerCart.id },
});
}
dispatch(updateUser(customer));
},
onError: (error) => {
checkHasAuth(error);
},
});
useEffect(() => {
if (token) {
// here i am calling first and 2nd time
getUser();
}
}, [getUser, token]);
Lösung des Problems
Es scheint ein bekanntes Problem zu sein, dass die onCompleted
Option von Apollo zwischen Abfragen, die über das Netzwerk und durch den Cache ausgeführt werden, unterschiedlich funktioniert. Wenn die Anfrage aus dem Cache erfüllt werden kann, dann onCompleted
wird nicht aufgerufen, wohingegen wenn die Anfrage über das Netzwerk über den Server erfüllt wird, dann aufgerufen onCompleted
wird.
Sie können fetchPolicy
in den Optionen, an die Sie übergeben, festlegen, dass der Cache umgangen wird, wenn Sie die Ausführung des Rückrufs useLazyQuery
erzwingen möchten:onCompleted
const [loadData] = useLazyQuery(QUERY, {fetchPolicy: 'network-only', onCompleted:...})
Github-Problem: https://github.com/apollographql/apollo-client/issues/9338
Apollo-Dokumentation für fetchPolicy-Optionen: https://www.apollographql.com/docs/react/data/queries/#setting-a-fetch-policy
Keine Kommentare:
Kommentar veröffentlichen