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 шт):

Автор решения: De.Minov

setTimeout запустит функцию переданную первым параметром, через указанное кол-во миллисекунд вторым параметром, после инициализации этого участка кода JS "читает" дальше, там console.info() с получение значение по ключу из хранилища, они вернут undefined т.к. их нет.

Через 5 секунд запускается функция.
Там через пару строк снова запрашиваем значение у сессионного хранилища - ответ должен быть undefined, ибо по коду нигде назначений не было, но вы указали что возвращается null, допустим..

Далее проверка, которая вернёт true, ибо одно из условий проходит (второе - sessionStorage.getItem(nickname, result) === undefined).

Окей, там очищаем сессию, причём всю.. Допустим.
Далее создаём ключ с новым значение по переменным.

Переходим на вторую проверку.. вернёт false, ещё и ... localStorage.getItem,false это что вообще? Она пролетает, ибо по коду не вижу назначения в локальное хранилище.


Решения два:

  1. Обдумать и сформулировать код, ну и переписать всё заного.
  2. Докинуть в вопрос недостающую часть кода, ибо что-то мне подсказывает, что вы что-то упустили. Если не так, то остаётся только первый вариант решения.

Дополнение ответа

В условиях ошибки

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)?

→ Ссылка