!sessionStorage.getItem('isAuthenticated') && x
будет оценивать x
только в том случае, если sessionStorage.getItem('isAuthenticated')
достигнет значения falsy (потому что вы используете !
для инвертирования значения при его тестировании)."true"
- это не ложное значение, а истинное.
Есть вторая проблема: sessionStorage
значения всегда строки , поэтому вы храните "true"
и "false"
, оба из которых являются истинными значениями, а не true
и false
.
Есть и третья проблема: this
в вашем конечном обработчике then
не будет ссылаться на то, что выожидая, что он будет ссылаться, вы, вероятно, захотите использовать функцию стрелки (или связанную функцию).Подробнее об этом здесь: http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback
Таким образом, минимальные изменения версии:
Преобразование "true"
или "false"
обратно в true
или false
и
Избавьтесь от !
при вашем условии
Используйте функцию стрелки (или связанную функцию).
Я бы также предложил использовать if
, не используя &&
для побочных эффектов.
Так, например (обратите внимание на функцию стрелки):
.catch((error) => {
console.log(sessionStorage.getItem('isAuthenticated')); //returns true as expected
if (sessionStorage.getItem('isAuthenticated') === "true") {
this.props.history.push("/");
}
})
Но если это действительно конец цепочки обещаний, правильный способ справиться с этим - просто переместить это в ваш более ранний обработчик then
(обратите внимание на функции стрелок):
axios.get(`http://localhost:8080/api/users/${encodedEmail}`,{
headers: {
'Access-Control-Allow-Origin': '*',
Authorization: 'Basic ' + btoa(email + ":" + password)
}
})
.then((response) => {
console.log(response);
sessionStorage.setItem('isAuthenticated', true);
this.props.history.push("/"); // <==================
})
.catch((error) => { // Doesn't have to be an arrow, but if you relocate any code...
console.log(error);
sessionStorage.setItem('isAuthenticated', false);
});
Еслиу вас есть другие вещи, которые вы делаете в этом последнем then
, но я бы распространял флаг через цепочку обещаний, а не возвращался к sessionStorage
для этого:
axios.get(`http://localhost:8080/api/users/${encodedEmail}`,{
headers: {
'Access-Control-Allow-Origin': '*',
Authorization: 'Basic ' + btoa(email + ":" + password)
}
})
.then((response) => {
console.log(response);
sessionStorage.setItem('isAuthenticated', true);
return true;
})
.catch((error) => {
console.log(error);
sessionStorage.setItem('isAuthenticated', false);
return false;
})
.then((isAuthenticated) => {
if (isAuthenticated) {
this.props.history.push("/");
} else {
// do the other thing...
}
});
...но на самом деле имеет смысл поместить эти две ветви в обработчики then
и catch
(средний пример), а не распространять флаг.