JavaScript Variable Stuck inside Loop - Can't Access
我正在进行AJAX调用以检索某个州的所有商店。 问题是,最后两行是否无法访问我在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var states = ['TX', 'AZ]; for(j = 0; j < states.length; j++) { var fullHTML = ''; var full2; $.get("//127.0.0.1:8000/api/state-stores/", {state: states[j]}, function(data) { console.log(data.stores.length); for(var i = 0; i < data.stores.length; i++) { store_html = '<tr><td>' + data.stores[i].name + '</td><td>' fullHTML += store_html; } }) // PROBLEM HERE console.log(fullHTML); //empty $("#" + states[j].toLowerCase() +"-table").html(fullHTML); //does nothing } |
我该怎么做才能解决这个问题? 我一直在尝试奇怪的全局变量技巧和各种各样的hack-y事情,但没有任何工作。
UPDATE
我也尝试将最后两行放在
在调试之后,似乎只有来自外部循环的
更新2
我按照答案中给出的建议,我正在为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $(function() { var states = ['AZ', 'CA', 'CO', 'GA', 'NV', 'NC', 'SC', 'TX']; // var states = ['CA']; for(var j = 0; j < states.length; j++) { var current = j; $.get("//127.0.0.1:8000/api/state-stores/", {state: states[j]}, function(data) { var fullHTML = ''; for(var i = 0; i < data.stores.length; i++) { store_html = '<tr><td>' + data.stores[i].name + '</td><td>' + data.stores[i].address + '<span class="small-table">' + data.stores[i].city + '</span></td><td>' + data.stores[i].city + '</td><td>' + data.stores[i].state + '</td><td>' + data.stores[i].postal_code + '</td></tr>' fullHTML += store_html; } $('#' + states[current].toLowerCase() + '-table').html(fullHTML); }) } }); |
这是一个异步的$ .get函数。也就是说,代码执行不会在该行等待,直到$ .get完成,执行回调函数,然后继续到$ .get之后的下一行。实际上,它将对$ .get函数执行异步调用,并继续立即执行到
至于您对
编辑
如果我们声明一个匿名函数并在该上下文中执行$ .get,我们可以强制创建一个新的作用域。这不是一个漂亮的解决方案,但它的工作原理!
要修复代码,请将调用放在$ .get回调中,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var states = ['TX', 'AZ']; for(j = 0; j < states.length; j++) { var fullHTML = ''; var full2; (function() { var current = j; $.get("//127.0.0.1:8000/api/state-stores/", {state: states[j]}, function(data) { console.log(data.stores.length); for(var i = 0; i < data.stores.length; i++) { store_html = '<tr><td>' + data.stores[i].name + '</td><td>' fullHTML += store_html; } console.log(fullHTML); // not empty anymore $("#" + states[current].toLowerCase() +"-table").html(fullHTML); //does stuff }); })(); } |
现在,您的代码只会在填充