Uncaught SyntaxError: Unexpected token u in JSON at position 0

230
03 января 2019, 12:10

у меня есть массив,который я беру из localStorage с помощью такого кода

function loadCart(data) {
//проверяю есть ли в localStorage запись cart
if (localStorage.getItem('cart')) {
    // если есть - расширфровываю и записываю в переменную cart
    cart = JSON.parse(localStorage.getItem('cart'));
        if(isEmpty(cart)){
            $('.main-cart').html('Корзина пуста');
        }
        else init();
}
else {
   $('.main-cart').html('Корзина пуста');
}

}

после этого загружаю ассоциативный массив с товарами из бд

function init(){
$.post(
 'pages/adminPage/core.php',
{
    "action":"loadGoods"
},
showCart
);
}

и вывожу товар из localStorage

        function showCart(data) {
var pack= JSON.parse(data);
var out = '';
    for (var id in cart) {
        for (key in pack) {
            if(id===pack[key].id){
                out += `<button data-id="${id}" class="del-goods">x</button>`;
                out += `<img src="pages/orderPage/goods/${pack[key].img}" 
                width='50em' height='50em'>`;
                out += ` ${pack[key].name  }`;
                out += `  <button data-id="${id}" class="minus-goods">- 
      </button>  `;
                out += ` ${cart[id]} `;
                out += `  <button data-id="${id}" class="plus-goods">+ 
      </button>  `;
                out += cart[id]*pack[key].cost;
                out += '<br>';
            }
        }
    }
$('.main-cart').html(out);
$('.del-goods').on('click', deleteGoods);
$('.plus-goods').on('click', plusGoods);
$('.minus-goods').on('click', minusGoods);
}

Проблема в том,что когда я выполняю ф-цию minusGoods

function minusGoods(){
//уменьшает товар в корзине на 1
var id = $(this).attr('data-id');
if (cart[id]===1){
    delete cart[id];
}
else cart[id]--;
saveCart();
showCart();

}

вылетает эта ошибка Uncaught SyntaxError: Unexpected token u in JSON at position 0 Скорее всего я неправильно делаю, пожалуйста подскажите в чем проблема

Answer 1

showCart вызывается без параметров, следовательно во время выполнения значение параметра data - будет undefined.

Далее идет попытка вызова

data=JSON.parse(data);

что в данном случае эквивалентно

data=JSON.parse(undefined);

undefined преобразовывается в строку "undefined" - и идет попытка разобрать данную строку как JSON.

В итоге закономерная ошибка:

try { 
  JSON.parse('undefined'); 
} catch (e) { 
  console.log(e + ''); 
}

Для решения нужно просто передать параметр в функцию. Исходя из предоставленного кода, что-то вроде:

showCart(cart[id]);

Либо проверять внутри функции передан параметр или нет:

if(!isEmpty(cart) && data){

И как альтернатива - использовать для инита и обычной работы - разные функции.

READ ALSO
замена jQuery на родной Javascript при работе с классами CSS

замена jQuery на родной Javascript при работе с классами CSS

Изучаю вопрос перехода от jQuery к родному JavascriptПодскажите, правильно ли я понимаю, что особенность jQuery в последовательном применении функций...

196
Миграция React-проекта с JavaScript на Typescript. Оставлять Babel?

Миграция React-проекта с JavaScript на Typescript. Оставлять Babel?

В инструкции по миграции проекта на Typescript есть пункт

161
Как объединить все спаны с анимацией?

Как объединить все спаны с анимацией?

У меня раздутый код - дохрена спанов, потому что текстовую анимацию делал без библиотекиЕсть ли способ обернуть уже имеющиеся спаны во что-то,...

144
Не работает Drag&#39;n&#39;drop JS

Не работает Drag'n'drop JS

Задача: есть произвольное количество групп, в каждой группе произвольное количество карточекНужно обеспечить возможность перетаскивания...

135