1
function jQueryFunction(url,callback)
{ 
    $.ajax
    ({
        type: "GET",
        async: false,
        url: url,
        dataType: "jsonp",
        jsonp: "callback",
        jsonpCallback: "tpsHandler",
        success: function(json)
        {
            return callback(json);
        }
    });  
}

function tmpFunction(callback) 
{
    var jsonArray = new Array();
    var i = 0;

    while(true)
    {
        for(var j = 0; j < url_array.length; j++)
        {
            jQueryFunction(url_array[j], function(json){
                jsonArray[j] = json;
                i++;
            });
        }

        if(i >= url_array.length)
        {
            return callback(jsonArray);
        }
        else
        {
            alert(i);
        }
    }
}

tmpFunction を呼び出すと、Web サイトに「0」が表示され続けます。なぜi常に 0 なのですか? tmpFunction はforループを実行しませんか?

4

3 に答える 3

0

この問題全体に対するより良い解決策は、遅延オブジェクトを使用することです。

while (true)意味がないので、今のところは無視します。

function jQueryFunction(url)
{ 
    return $.ajax({
        type: "GET",
        async: true,                  // NB: **not** false
        url: url,
        dataType: "jsonp",
        jsonp: "callback",
        jsonpCallback: "tpsHandler"   // any good reason why you're defining this?
    });  
}

function tmpFunction(callback) 
{
    var def = [];     

    for (var i = 0; i < url_array.length; ++i) {
        def.push(jQueryFunction(url_array[i]));
    }

    return $.when.apply($, def).done(callback);
}

これにより、すべての AJAX クエリが並行して実行され (ホストごとのクライアント接続制限の対象となります)、すべてが完了すると、配列callback内の各結果 (送信順に) で呼び出されます。arguments

callback注意: これは、結果の配列である単一のパラメーターを渡した元のセマンティクスとまったく同じではありません。それを維持したい場合は、次を使用します。

.done(function() {
    var args = [].slice.call(arguments, 0);
    callback.call(this, args);
});
于 2013-10-03T23:13:22.737 に答える