Javascript AJAX请求不再指向成功回调方法中的正确变量
例如,在我的HTML文件中,表中有以下表行,{{}}只是变量:Javascript AJAX请求不再指向成功回调方法中的正确变量,javascript,html,ajax,flask,Javascript,Html,Ajax,Flask,例如,在我的HTML文件中,表中有以下表行,{{}}只是变量: {{object.name} {{object.name} 然后在我的JavaScript文件中,我有以下代码: var rows=document.getElementsByTagName(“tr”); 对于(var r=0;r
{{object.name}
{{object.name}
然后在我的JavaScript文件中,我有以下代码:
var rows=document.getElementsByTagName(“tr”);
对于(var r=0;r
我得到的结果是:
{{object.name}
{{object.name}
当for循环中的行为0时的SomeJSON
当for循环中的行为1时的SomeJSON
然而,我的预期结果是:
{{object.name}
当for循环中的行为0时的SomeJSON
{{object.name}
当for循环中的行为1时的SomeJSON
我知道我可以通过添加到AJAX请求async:false
来解决这个问题,但我希望保持它的异步
任何帮助都将不胜感激。这可能是一个涉及Javascript闭包的问题吗?如果在for循环内定义函数并在函数内分配变量,则它们将通过成功回调保留其作用域 另一种(更干净/更优雅的)解决方案将
for
循环和函数调用重写为(谢谢)
在函数内部,变量的作用域是有限的。以前,每个ajax成功回调都引用相同的变量(异步请求返回时的变量)
您是否尝试过将(var rows=0;rows
tableRows
不在您的代码中。因为$.ajax
是异步的,在调用success时,tr将是tableRows[tableRows.length-1]
一切成功functions@MichaelCoker-为什么更改变量名会有不同?@JaromandaXrows
是所有的tr
,然后OP将其用作循环的计数器,但引用tableRows
,这在代码中不存在。抱歉,在问题中误读了代码:平移甚至更干净的解决方案是将for循环替换为[].forEach.call(tableRows,function(tr){…})
好主意,我刚开始回家,大约一个小时后会编辑,非常感谢!@Hodrobond嘿,我编辑了代码,我在试图让代码更容易从实际代码中理解时,在变量名上犯了一些错误。请你更新你的答案好吗当然,给我大约一个小时左右的时间,我会回来的电脑前:)@Hodrobond您的解决方案确实有效,谢谢您的帮助
[].forEach.call(rows, function(tr) {
var id = tr.id;
$.ajax({
url: "/some-link/" + id,
success: function(some_json){
some_json = JSON.parse(some_json);
var td = document.createElement("td");
td.innerHTML = some_json;
tr.appendChild(td);
}
});
});