Ошибки вызовут блок catch в цепочке обещаний, а не первый аргумент блока then.
const isAuthenticated = () => {
return authApi.isActiveToken(localStorage.getItem('token')).then(
(res) => {
console.log(res);
if (res.status > 400) {
return false;
}
return true;
},
(error) => {
return false;
}
);
};
Или как отдельный блок catch:
const isAuthenticated = () => {
return authApi
.isActiveToken(localStorage.getItem('token'))
.then((res) => {
console.log(res);
if (res.status > 400) {
return false;
}
return true;
})
.catch((error) => {
return false;
});
};
Другая возможность используя async / await, я предпочитаю использовать это, так как его легче читать, но это может сбивать с толку, потому что он маскируется под внешний вид синхронного кода.
const isAuthenticated = async () => {
try {
await authApi
.isActiveToken(localStorage.getItem('token'))
return true;
} catch (error) {
return false;
}
};
Редактировать: Вот как это сделать измените ваш код, чтобы учесть асинхронный характер вызова isAuthenticated. Причина, по которой вы столкнулись с проблемой, заключается в том, что Обещания правдивы по своей природе, и вы выполняли троичную операцию из Обещания, а не из значения из обещания.
Асинхронный код работает, немедленно возвращая обещание, которое является по существу, это ценность. В какой-то момент обещание приведет к значению, но вы не можете рассчитывать на то, что оно будет значением в синхронном коде, поэтому вы должны установить состояние, которое позволит вашему компоненту знать, каким будет значение.
import { useEffect, useState } from 'react';
const isAuthenticated = async () => {
try {
await authApi.isActiveToken(localStorage.getItem('token'));
return true;
} catch (error) {
return false;
}
};
const AuthenticatedRoute = ({ component: Component, ...rest }) => {
const [authenticated, setAuthenticated] = useState();
useEffect(() => {
isAuthenticated().then((authenticated) => {
setAuthenticated(authenticated);
});
});
return (
<Route
{...rest}
render={(props) => {
return authenticated === undefined ? (
'Loading...'
) : authenticated ? (
<Component {...props} />
) : (
<Redirect to="/" />
);
}}
/>
);
};
const UnauthenticatedRoute = ({ component: Component, ...rest }) => {
const [authenticated, setAuthenticated] = useState();
useEffect(() => {
isAuthenticated().then((authenticated) => {
setAuthenticated(authenticated);
});
});
return (
<Route
{...rest}
render={(props) => {
return authenticated === undefined ? (
'Loading...'
) : !authenticated ? (
<Component {...props} />
) : (
<Redirect to="/" />
);
}}
/>
);
};