10

サーバーからいくつかの結果を取得するために、ループで 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'); 
}
4

1 に答える 1

30

これは、クロージャーのかなり標準的な問題です。これを行う場合:

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

への参照をバインドしています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');

すべてをまとめておきたい場合は、関数を自己実行関数でインライン化することもできます。

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 に答える