10

我在循环中使用 jQuery“GET”从服务器获取多个结果。我想将循环索引作为固定参数包含在回调中,但它不起作用。

(我遵循了这篇文章关于如何做的建议。)

然而,我在回调中得到的值完全不是我所期望的——而不是每个循环索引值,它总是等于索引的退出值。

IE。此处的代码片段为回调的每次执行打印出“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'); 
}
4

1 回答 1

30

这是一个非常标准的闭包问题。当你这样做时:

function(data, textStatus) { test(data, textStatus, idx); }

您将引用绑定idxidx. 因此,当您的回调被调用时,循环将完成,并且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');

如果你想把它放在一起,你也可以用一个自执行的函数内联函数:

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);

函数调用为您提供函数idx何时被调用的值,idx这就是您想要的值。

于 2011-08-08T07:54:14.557 回答