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 onCompletedOption 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 onCompletedwird nicht aufgerufen, wohingegen wenn die Anfrage über das Netzwerk über den Server erfüllt wird, dann aufgerufen onCompleted wird.
Sie können fetchPolicyin den Optionen, an die Sie übergeben, festlegen, dass der Cache umgangen wird, wenn Sie die Ausführung des Rückrufs useLazyQueryerzwingen 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