0

wordpress プラグインを作成していて、画像をインポートする関数があります。これは、反復ごとに .load() 関数を呼び出す $.each() ループで行われます。ロード関数が呼び出すロード関数ページは、画像をダウンロードして数値を返します。番号はスパン要素にインポートされます。ソース配列と宛先配列は、非表示の UL の LI 要素からインポートされています。

このようにして、ゼロからインポートされた画像の総数までをカウントするカウンターがユーザーに表示されます。以下のjQueryコードを使用できます。

jQuery(document).ready(function($) {

    $('#mrc_imp_img').click(function(){
    var dstA = [];
    var srcA = [];
    $("#mrc_dst li").each(function() { dstA.push($(this).text()) });
    $("#mrc_src li").each(function() { srcA.push($(this).text()) });

        $.each(srcA, function (i,v) {
            $('#mrc_imgimport span.fc').load('/wp-content/plugins/myplugin/imp.php?num='+i+'&dst='+dstA[i]+'&src='+srcA[i]);
        });

    });


});

これはかなりうまく機能しますが、ロード関数が DOM を本来の速度で更新していないように見えることがあります。これは、スパンが更新される数値が前の数値よりも小さい場合があり、ほとんどの場合、最後の数値が小さい数値に置き換えられているためです。終わり。これが起こらないようにするにはどうすればよいですか?また、$.each-loop の準備ができたときに「#mrc_imp_img」を非表示にするにはどうすればよいですか?

4

2 に答える 2

1

以前に呼び出されたAJAX呼び出しは、より早く終了することが保証されていないため、番号が小さいほど、大きい番号が上書きされる可能性があります。1つの解決策は、呼び出しが成功するたびにカウンターを単純にインクリメントすることです。

jQuery(function($) {
  $('#mrc_imp_img').click(function(){
    var dstList = $("#mrc_dst li");
    var srcList = $("#mrc_src li");
    dstList.each(function(i) { 
      var dst = $(this).text();
      var src = srcList[i].text();
      $.post('/wp-content/plugins/myplugin/imp.php?num='+i+'&dst='+dst+'&src='+src, function() {
        $('#mrc_imgimport span.fc').text($('#mrc_imgimport span.fc').text()+1);
      });
    });
  });
});

(不要な配列操作を回避するようにコードを変更し、省略形を使用するようにonready呼び出しを変更し、状態を変更する操作に使用する必要があるPOSTを使用するようにAJAX呼び出しを変更しました。)

于 2010-05-15T12:21:19.583 に答える
0

ほとんどのサーバーでは、限られた数のスレッドが実行されている可能性があります。一度に 10 個の呼び出しを開始し、サーバーに 5 つのスレッドしかない場合、そのうちの 5 つが失敗します。

また、実行中のすべてのスレッドを最大にすると、他のユーザーはサーバーにアクセスできなくなるため、基本的にサーバーを DOS 処理することになります。

一度に 1 つの呼び出しに遅くしてもかまわない場合は、呼び出しをシリアル化する Tgr の推奨に従って、次の呼び出しを開始する前に各呼び出しが完了するまで待ちます。

私はヨーダが提案したものを好むだろう. できることは、配列全体を処理する 1 つのサーバー呼び出しに変えることです。本当にクライアント側でカウンターを更新したい場合は、その 1 つのサーバー呼び出しでデータベース内のカウンターを更新できます。次に、2 回目の ajax 呼び出しで数秒ごとにサーバーをポーリングして、カウンターの場所を確認できます。明らかに、シーケンシャルであることが保証されているわけではありませんが、サーバーの健全性には優れています。シーケンシャルな側面を偽造することもできます (#3 を使用していて、次の呼び出しで #6 が返された場合 - クライアント側で 1 つずつインクリメントします)。

アラートが表示されない限り、アラート行の前または上に JavaScript エラーがある可能性があります。firebug および console.log ステートメントを使用してみてください。

于 2010-05-15T14:58:17.407 に答える