useEffect
само возвращает void
, но функция, предоставленная для useEffect
, набирается как EffectCallback
. Это определяется как:
// NOTE: callbacks are _only_ allowed to return either void, or a destructor.
// The destructor is itself only allowed to return void.
type EffectCallback = () => (void | (() => void | undefined));
Источник
Это означает, что ваш обратный вызов эффекта может фактически возвращать функцию, которая должна возвращать void
или undefined
.
Теперь вы можете решить свою проблему, чтобы избежать вызова setState
с переменной isSubscribed
. Но другой (возможно, лучший) способ состоит в прямой отмене запроса.
useEffect(() => {
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('...', { cancelToken: source.token }).then(/**/).catch(e => {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {/* handle error */}
});
return () => source.cancel();
}, [props.foo])
Это также задокументировано в README .
Проблема с вашим текущим кодом , что ваша деструкторная функция возвращает логическое значение isSubscribed
. Вместо того, чтобы возвращать его, просто поместите присвоение в тело функции:
return () => {
isSubscribed = false;
}