将Localstorage变量名称设置为变量的值

时间:2014-06-08 00:58:05

标签: javascript jquery variables local-storage

我正在使用javascript循环来创建localstorage变量。由于某种原因,除最后一个之外,所有localstorage值都为null。有谁知道为什么?

这是我的代码:

function setValues() {
    var json = jQuery.parseJSON(data);
    for (var i=0; i<json.length; i++)
    {
        var id = json[i].id;
        $.ajax({
            url: url,
            crossDomain: true,
            type: 'post',
            data: {
                'theid': id
            },
            success: function (data2) {
                window.localStorage['club'+id] = data2;
            },
       });
    }
}

function getValue(id) {
   console.log(window.localStorage.getItem('club'+id));
}

我调用getValue()else代码中的哪个位置与问题无关。如果&#39; id&#39;是用于添加到localstorage的最后一个id,它不是null。但是,好像所有以前的值都被覆盖了。

如何解决此问题?任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:3)

根据OP的问题变更回答问题

这实际上是一个非常常见的JavaScript问题,几乎不可能搜索,除非你已经知道所涉及的魔术字的答案。

因为你的措辞与通常的问题略有不同,我不打算投票来解决这个问题,而是解释发生了什么。

变量i只有一个副本,并且该循环运行时该变量会发生变化。当回调返回时,该循环已经结束并且i已达到其最终值。

您需要做的是捕获该值的本地副本。有两种方法可以做到 - 我将展示最容易阅读的方法:

function doAjax(i) {
  // this 'i' is private.
  var id = json[i].id;
  $.ajax({
    url: url,
    crossDomain: true,
    type: 'post',
    data: {
      'theid': id
    },
    success: function (data2) {
      window.localStorage['club' + id] = data2;
    }
  });
}

function setValues() {
  var json = jQuery.parseJSON(data);
  for (var i = 0; i < json.length; i++) {
    doAjax(i);
  }
}

另一种方法是使用闭包和匿名函数:

function setValues() {
  var json = jQuery.parseJSON(data);
  for (var i = 0; i < json.length; i++) {
    (function (i2) {
      // this 'i' is private.
      // Givign it the name of 'i2' just to be clear
      var id = json[i2].id;
      $.ajax({
        url: url,
        crossDomain: true,
        type: 'post',
        data: {
          'theid': id
        },
        success: function (data2) {
          window.localStorage['club' + id] = data2;
        },
      });
      // this is the 'i' from the main loop
    }(i));

  }
}

有关详细信息,请参阅