我需要为每个i
值(JSON加载)获取正确的response
值。我该怎么做?
假设我有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不是一种等待特定操作完成的语言,它可以同时执行大量操作(忘记了科学名称)。
答案 0 :(得分:5)
问题源于这样一个事实:你的回调不是关闭注册时有效的i
值;每个回调都会看到i
的相同实例,最终会得到循环完成后的值(files.length
)。
使用jQuery做的明智之处是使用$.each
作为编码器说。但是用纯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
传递了一个接收索引作为参数的匿名函数。