localStorage返回undefined直到刷新?

时间:2017-06-09 11:03:25

标签: javascript html5 local-storage

我已经注意到localStorage中的一个错误,或者我认为是一个bug,这很难解释,但我会尝试。

我正在写一个简单的本地购物车。为了使事情正常工作,我检查存储是否已经存在,如果不是这样,则将空数组放入其中。

然而,即使在此检查之后,localStorage仍然保持未定义,直到我第二次刷新页面。请参阅以下代码:

const cart = function(name) {
    this.storageNamespace = name;
    this.get = store.get(this.storageNamespace); 
};

cart.prototype.set = function (data) {
    store.set(this.storageNamespace, data);
}

cart.prototype.add = function (item) {
    if (this.get === undefined) {
        store.set(this.storageNamespace, []);
    }
    let cart = this.get;
    if (cart.length !== 0) {
        for (let i = 0; i < cart.length; i++) {
            if (cart[i].id === item.id) {
                cart[i].ammount = Number(cart[i].ammount) + Number(item.ammount);
                this.set(cart);
                break;
            } else if (i === cart.length - 1) {
                cart.push(item);
                this.set(cart);
                break;
            }
        }
    } else {
    cart.push(item);
    this.set(cart);
    }
}

一些事情。是的,this.get返回undefined,我已经从控制台测试了它。因此,我不会理解为什么if语句中的代码没有运行。我把if语句放在几个地方,包括构造函数。到处都是相同的

虽然第二次访问一切正常。

要清楚,即使它似乎评估为true,代码仍然无效:

if (this.get === undefined) {
    store.set(this.storageNamespace, []);
}

1 个答案:

答案 0 :(得分:1)

const cart = function(name) {
  this.storageNamespace = name;
  this.get = store.get(this.storageNamespace); /* store.get is function 
  call, value be will initialized once instance of this function is created */
};

第一次创建此函数的实例时,使用&#34; get&#34; property - undefined已创建,因为您最初在localstorage中没有任何值。

cart.prototype.add = function (item) {
if (this.get === undefined) {
    store.set(this.storageNamespace, []); /* Here, you insert value in 
    localstorage,but object's 'get' property is still undefined,i.e there is 
    value in localstorage but not in this object's property */
   // *** Missed this -> this.get = store.get(this.storageNameSpace)
}
let cart = this.get; /* undefined, hence 'if' is not executed */
if (cart.length !== 0) {
    for (let i = 0; i < cart.length; i++) {
        if (cart[i].id === item.id) {
            cart[i].ammount = Number(cart[i].ammount) + Number(item.ammount);
            this.set(cart);
            break;
        } else if (i === cart.length - 1) {
            cart.push(item);
            this.set(cart);
            break;
        }
    }
 } else {
 cart.push(item); 
 this.set(cart);
 }
}