0

私はいくつかの「ajax」呼び出し(実際にはsjaxと呼ぶことができると思います)を持っていて、一度に1つずつページにレンダリングさせようとしていますが、そうではありません。それらはすべて最後にレンダリングされます。どうすればそれらを離すことができますか?

function getNames() {
    var names = $('#thenames').val();
    alert(names);
    var splitnames = names.split(',');
    for(var i = 0; i < splitnames.length; i++) {
    var name = splitnames[i];

    $.ajax({
        type: 'GET',
        url: '/acert/secure/people/namesservice/getnamesajax.jsp',
        data: { usernames: name},
        success: function(data) { $('#results').html($('#results').html() + data);},
        async: false });
        }
    }
}

それらが間違った順序で戻ってくる危険を冒すことはできないので、それらを同期させる必要があります。それらを for ループに入れたので、for ループはブラウザーに呼び出し間でレンダリングする機会を与えるはずですが、うまくいかないようです。

私が間違っていることについてのアイデアはありますか?

成功関数にアラートボックスを追加すると機能しますが、操作をベビーシッターする必要はなく、時々その進行状況を監視したいだけです。

4

4 に答える 4

2

async: false ブラウザをブロックします。DOM への再描画を含め、すべてを完全にロックします。

を使用しないことを強くasync: falseお勧めします。非常に悪いです。

呼び出しの合間に使用できる場合もありますがsetTimeout、ブラウザーが再描画をトリガーすることは保証されません。

設定した場合async: true、この問題は発生しませんが、非同期動作を適切に処理するためにコードを変更する必要がある可能性があります。


async false は非常に悪い jQuery は API から削除することにしました。

于 2013-02-28T16:20:08.047 に答える
1

使用しないでくださいasync: false

以下のコードは、すべての ajax リクエストを可能な限り高速に実行し、コンテンツを #results に正しい順序で追加します。async: false以下のコードを使用している場合は含めないでください。

var defArr = [];

for(var i = 0; i < splitnames.length; i++) {
    defArr.push( $.ajax({...}) );
}

$.when.apply($,defArr).done(function(){
    var $results = $("#results");
    $results.empty();
    for (var i = 0; i < arguments.length; i++) {
        $results.append(arguments[i][0]);
    }
});
于 2013-02-28T16:24:56.383 に答える
0

呼び出す回数がわかっている場合 (または、返される結果のパラメーターとしてそれを含めることができる場合) は、単純に呼び出しを非同期で起動し、成功コールバックの配列内の要素にすることができます。配列が予想されるサイズになったら、それらを順番にレンダリングします。

于 2013-02-28T16:19:32.797 に答える
0

1 つには、追加の中かっこがあるようです。

しかし、当面の問題については、進行状況を監視したいだけであれば、使用しても問題ありませsetTimeoutんか?

- アップデート -

私はあなたがやろうとしていることを理解していると思います。私が間違っていなければ、少しリファクタリングしてから、名前をキーとしてクロージャーとオブジェクトを使用できます。このようなもの:

function getNames()
{
    var names = $('#thenames').val();
    var splitnames = names.split(',');
    var myData = {};


    for(var i = 0; i < splitnames.length; i++) 
    {
        (function(name) 
            { return function(){
            $.ajax({
                type: 'GET',
                url: '/acert/secure/people/namesservice/getnamesajax.jsp',
                data: { usernames: name},
                success: function(data) { myData[name] = data; updateNames(); }
            });

        })( splitnames[i] )
    }
}

これが基本的に行うことは、一連の ajax 呼び出しをすぐにセットアップすることです。 (function(){})() の途中にある奇妙なビットにより、最後nameに設定された値を取得しないようにします。ループが終了したとき。すべてが に保存さmyDataれます。全員がロードされたら、あなたが持っているすべての名前が関数に含まれているかどうかを確認できると思いましたsplitnames。何かのようなものmyDataupdateNames

var count = 0; 
for ( var i = 0; i < splitnames.length; i++ ) 
{
    count += myData[splitnames[i]] != null ? 1 : 0; 
}

if (count == splitnames.length)
{
   // write the names to the screen
}

それは理にかなっていますか?

しかし、正直なところ、最善の方法はおそらく getnamesajax.jsp を変更して、すべての名前を受け入れ、必要な情報を必要な順序で返すようにすることです。それがオプションである場合は、1 つの ajax 呼び出しを行うだけでよいため、それが最適です。

于 2013-02-28T16:22:46.237 に答える