0

利用可能なアイテムが見つかるまでリストをチェックし続けたい。リスト内の各アイテムに対して、アイテムが利用可能かどうかを確認するためにポスト リクエストが作成されます。非同期にしておきたい。また、私は ajax 関数ではなく ajaxq 関数を使用していることにも注意してください。これは、このキューイング スクリプトhttp://code.google.com/p/jquery-ajaxq/を使用しているためです。ですから、それが始まる前に終わることはありません。それは問題ではないと確信しています。

アイテムが利用可能になったらループから抜け出す方法が必要なので、関数内のループから抜け出すことができないため、コールバック関数だけを使用することはできません。そのため、完了したら変数をインクリメントし、do-while ループを使用するとうまくいくと思いましたが、終わりのないループのようにブラウザがフリーズするだけです。

これを修正する方法、またはより良い方法で行う方法についての提案は素晴らしいでしょう。

do {

    var d = 0;
    for(var i in list) {

        var item = list[i];

        $.ajaxq('queue', {
            type: 'POST',
            url: baseURL + '/ChangeItem/Check',
            data: {
                'newItem': item, 
                'purchaseItem': false
            },
            error: function(jqXHR, textStatus) {
                alert(textStatus);
            },
            dataType: 'text',
            success: function(data) {
                if(thisObject.isNotTaken(data)) {
                    d++;
                    thisObject.claimItem();
                }
            }
        });
    }

} while(d == 0);
4

3 に答える 3

1

再帰関数を使用できます。

function ChangeItem(list, index) {
        var item = list[index];

        $.ajaxq('queue', {
            type: 'POST',
            url: baseURL + '/ChangeItem/Check',
            data: { 'newItem': item, 'purchaseItem': false },
            error: function(jqXHR, textStatus) { alert(textStatus); },
            dataType: 'text',
            success: function(data) { 
                 if(thisObject.isNotTaken(data)) { thisObject.claimItem(); doWhateverYouWantNext(); } 
                 else ChangeItem(list, index+1);  
            }

        });
}
于 2012-09-28T06:54:03.093 に答える
1

リクエストがキューに入れられるという事実は、それらが順番に実行されること、および最初のリクエストが 2 番目のリクエストが開始される前に終了することを保証するだけです。2 番目の要求をキューに入れるコードが、最初の要求が完了するまで待機するという意味ではありません。したがってajaxq、ここではどちらの方法でも役に立ちません。AJAX コールバックから自身を呼び出す再帰関数にフォールバックする必要があります。

そうは言っても、これによりサーバーに対して一連のリクエストが発生し、おそらく一連のデータベース検索が発生することに気付くでしょう。アイテムのリスト全体をサーバーに送信し、そこから最初に一致したものを返す方が、はるかに適切な方法であることがわかる場合があります。

于 2012-09-28T06:54:13.127 に答える
0

これを試してください:

var d = 0;
for(var i in list) {

    if(d == 0)
    {   
        var item = list[i];

        $.ajaxq('queue', {
            type: 'POST',
            url: baseURL + '/ChangeItem/Check',
            data: {
                'newItem': item, 
                'purchaseItem': false
            },
            error: function(jqXHR, textStatus) {
                alert(textStatus);
            },
            dataType: 'text',
            success: function(data) {
                if(thisObject.isNotTaken(data)) {
                    d++;
                    thisObject.claimItem();
                }
            }
        });

    }
}
于 2012-09-28T07:00:38.417 に答える