Software Carpentry: Lessons Learned
Scipy 2014 | Greg Wilson
Network requests can fail for a variety of reasons.
We need to handle these failures gracefully.
const [data, setData] = useState(); useEffect(() => { getIssues({}).then((data) => setData(data)); }, []);
const [data, setData] = useState(); useEffect(() => { getIssues({}).then((data) => setData(data)); }, []);
Redux example
const issues = useSelector((state) => state.api.issues);
useEffect(() => {
dispatch(getIssues());
}, []); const [data, setData] = useState(); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(); useEffect(() => { const abortController = new AbortController(); getIssues({ signal: abortController.signal }) .then((data) => { setData(data); setIsLoading(false); }) .catch((error) => { setError(error); setIsLoading(false); }); return () => { abortController.abort(); }; }, []);
const [data, setData] = useState(); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(); useEffect(() => { const abortController = new AbortController(); getIssues({ signal: abortController.signal }) .then((data) => { setData(data); setIsLoading(false); }) .catch((error) => { setError(error); setIsLoading(false); }); return () => { abortController.abort(); }; }, []);
const [data, setData] = useState(); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(); useEffect(() => { const abortController = new AbortController(); getIssues({ signal: abortController.signal }) .then((data) => { setData(data); setIsLoading(false); }) .catch((error) => { setError(error); setIsLoading(false); }); return () => { abortController.abort(); }; }, []);
const [data, setData] = useState(); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(); useEffect(() => { const abortController = new AbortController(); getIssues({ signal: abortController.signal }) .then((data) => { setData(data); setIsLoading(false); }) .catch((error) => { setError(error); setIsLoading(false); }); return () => { abortController.abort(); }; }, []);
const [data, setData] = useState(); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(); useEffect(() => { const abortController = new AbortController(); getIssues({ signal: abortController.signal }) .then((data) => { setData(data); setIsLoading(false); }) .catch((error) => { setError(error); setIsLoading(false); }); return () => { abortController.abort(); }; }, []);
const { data, isLoading, error } = useQuery({ queryKey: ["issues"], queryFn: ({ signal }) => getIssues({ signal }), });
const { data, isLoading, error } = useQuery({ queryKey: ["issues"], queryFn: ({ signal }) => getIssues({ signal }), });
const { data, isLoading, error } = useQuery({ queryKey: ["issues"], queryFn: ({ signal }) => getIssues({ signal }), });
What's happening here?
Think of queryKey as key prop on React component
Whenever queryKey changes, react-query will refetch the data.
More examples
Caching
Retries & Refetches
Conclusion
Resources
People to follow on Twitter
Thank you! Questions?