window.localStorage.getItem() и window.sessionStorage.getItem() возвращают null
Здраствуйте, только начинаю учить js
window.localStorage.getItem() и window.sessionStorage.getItem() возвращают null при том, что если зайти в application в хроме значения присутствуют.
let startBtn = document.getElementById("startBtn")
startBtn.onclick = game;
document.getElementById('clearBR').addEventListener('click', ClearBestResult)
document.getElementById('clearBRforAllTime').addEventListener('click', ClearBestResultForAllTime)
let result
function game() {
let count = 0
const nickname = document.getElementById("nickname").value
document.getElementById('click').addEventListener('click', clickCount)
let arr = []
function clickCount() {
count++
arr.push(count)
}
try {
if (nickname === "") throw new Error()
} catch (e) {
alert('nickname is empty')
}
finally {
setTimeout(function () {
result = arr.length
alert(`You clicked ${result} times`)
if (sessionStorage.getItem, (nickname, result) < result || sessionStorage.getItem, (nickname, result) === undefined) {
sessionStorage.clear()
sessionStorage.setItem(nickname, result.toString())
} else if (result > localStorage.getItem, (nickname, result) || localStorage.getItem === undefined) {
localStorage.clear()
localStorage.setItem(nickname, result.toString())
}
count = 0
arr.splice(0, arr.length);
}, 5000);
}
document.getElementById('BRforAllTime').addEventListener('click', bestForAllTimes)
document.getElementById('BR').addEventListener('click', bestResult)
function bestForAllTimes() {
alert(`Best result for the whole time is: ${localStorage.getItem(result)} by ${localStorage.getItem("nickname")}`)
}
function bestResult() {
alert(`Best result is ${window.sessionStorage.getItem(result)}`)
}
console.log(sessionStorage.getItem(result)) // null
console.log(localStorage.getItem(result)) //null
}
function ClearBestResult() {
window.sessionStorage.clear()
alert('Best result is cleared')
}
function ClearBestResultForAllTime() {
localStorage.clear()
alert('Best result for the whole time is cleared')
}
Ответы (1 шт):
setTimeout запустит функцию переданную первым параметром, через указанное кол-во миллисекунд вторым параметром, после инициализации этого участка кода JS "читает" дальше, там console.info() с получение значение по ключу из хранилища, они вернут undefined т.к. их нет.
Через 5 секунд запускается функция.
Там через пару строк снова запрашиваем значение у сессионного хранилища - ответ должен быть undefined, ибо по коду нигде назначений не было, но вы указали что возвращается null, допустим..
Далее проверка, которая вернёт true, ибо одно из условий проходит (второе - sessionStorage.getItem(nickname, result) === undefined).
Окей, там очищаем сессию, причём всю.. Допустим.
Далее создаём ключ с новым значение по переменным.
Переходим на вторую проверку.. вернёт false, ещё и ... localStorage.getItem,false это что вообще?
Она пролетает, ибо по коду не вижу назначения в локальное хранилище.
Решения два:
- Обдумать и сформулировать код, ну и переписать всё заного.
- Докинуть в вопрос недостающую часть кода, ибо что-то мне подсказывает, что вы что-то упустили. Если не так, то остаётся только первый вариант решения.
Дополнение ответа
В условиях ошибки
if(sessionStorage.getItem, (nickname, result) < result || sessionStorage.getItem, (nickname, result) === undefined) {
sessionStorage.clear()
sessionStorage.setItem(nickname, result.toString())
} else if (result > localStorage.getItem, (nickname, result) || localStorage.getItem === undefined) {
localStorage.clear()
localStorage.setItem(nickname, result.toString())
}
должно быть .getItem(nickname) который в свою очередь вернёт строку, чтобы сравнить её с result, которая судя по всему имеет числовой тип, нужно строку вовращаемого перевести в число.
Например так - Number(sessionStorage.getItem(nickname)) < result.
В некоторых местах вы запрашиваете .getItem('nickname'), но судя по коду вы хотите найти ключ по переменной, следовательно кавычки нужно убрать.
В целом больше ошибок не вижу, кроме тех, что описал выше до дополнения ответа.
Есть недочёт, как по мне.
Метод .clear() удалить все записи в хранилище, следовательно результаты всех игроков удалятся.
Может всё же лучше удалять "текущего" игрока, через .removeItem(nickname)?