1

我需要为i我的每一个response值(JSON 加载)获取正确的值。我怎么做?

假设我有 10 个 JSON 文件。所有这些都必须以正确的顺序加载、存储和显示给客户端。

所以它应该看起来像这样:

for (var i = 0; i < files.length; i++) {
    $.getJSON(files[i], function (response) {
        console.log(i);
        console.log(response);
    });
}

的结果response是我们所期望的 - 文件的内容,但变量i似乎总是相同的(= files.length)。我对此的解释是 JS 不是一种等待特定动作完成的语言,它可以同时执行很多动作(忘记了这个的学名)。

4

1 回答 1

4

问题源于您的回调在注册时没有关闭iin effect的值。每个回调都会看到相同的 实例i,最终在循环完成后具有它的值(即files.length)。

使用 jQuery,明智的做法是$.each按照 coder 所说的那样使用。但是用纯javascript解决它的方法是:

for (var i = 0; i < files.length; i++) {
    (function(idx) {
        $.getJSON(files[idx], function (response) {
            console.log(idx);
            console.log(response);
        });
    })(i);
}

通过创建并立即调用匿名函数,您可以将值重新绑定i到一个名为idx作用域的新局部变量中。然后每个回调都带有自己的idx,因此它最终会记录正确的值(i注册回调时的值,而不是后来的值)。这实际上正是您使用时发生的事情$.each,因为each您是否传入了一个接收索引作为参数的匿名函数。

于 2013-02-16T04:33:09.373 回答