Dan*_*nny 10 javascript jquery closures jquery-callback
我在循环中使用jQuery"GET"从服务器获取几个结果.我想将循环索引作为固定参数包含在回调中,但它不起作用.
(我遵循了本文关于如何做的建议.)
但是,我在回调中得到的值完全不是我所期望的 - 而不是每个循环索引值,它总是等于索引的退出值.
即.这里的代码片段为每次回调执行打印出'16'.如何让它打印1,2,3 ...(我意识到订单可能不同,那很好)
除了下面的代码,我还尝试了几种方法来指定回调函数,例如.function(data, textStatus) { return test(data, textStatus, idx); }, 'text');等等
这应该怎么样?
function test(data, textStatus, siteNo)
{
console.log("siteNo=" + siteNo);
}
function loadConfigLists()
{
var siteReport;
// retrieve site configuration
jQuery.get("svGetSiteConfig.php", function(data, textStatus)
{
// retrieve port configuration for all sites
for (var idx=1; idx<=15; idx++)
{
var probeIP = siteConfigArray[idx].siteIP;
if (probeIP != "" && probeIP != null)
jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx,
function(data, textStatus) { test(data, textStatus, idx); }, 'text');
else // IP value is blank
siteConfigArray[idx].portManifest = null;
}
}
}, 'text');
}
Run Code Online (Sandbox Code Playgroud)
mu *_*ort 30
这是一个非常标准的闭包问题.当你这样做:
function(data, textStatus) { test(data, textStatus, idx); }
Run Code Online (Sandbox Code Playgroud)
你绑定引用idx但不绑定的值idx.因此,当您的回调被调用时,循环将结束,并且idx在您绑定的所有回调中将为16.
通常的解决方案是强制idx通过函数调用进行评估:
function build_callback(idx) {
return function(data, textStatus) {
test(data, textStatus, idx);
};
}
// And then...
jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx, build_callback(idx), 'text');
Run Code Online (Sandbox Code Playgroud)
如果要将所有函数保持在一起,也可以使用自执行函数内联函数:
for (var idx=1; idx<=15; idx++)
(function(idx) {
var probeIP = siteConfigArray[idx].siteIP;
if (probeIP != "" && probeIP != null)
jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx,
function(data, textStatus) { test(data, textStatus, idx); }, 'text');
else // IP value is blank
siteConfigArray[idx].portManifest = null;
})(idx);
Run Code Online (Sandbox Code Playgroud)
函数调用为您提供调用idx函数时的值,idx这是您想要的值.