2011-08-05 8 views
1

javascriptの問題は、出力が ループがなく、結果が追加されていない間、私は内に複数のポストを送信しようとしている

<script type="text/javascript"> 
function action() { 
    var initval = 1; 
    var endval = 5; 
    do { 
    var action_string = 'txtuser=someone'; 

    $.ajax({ 
        type: "POST", 
        url: "http://localhost/js.php", 
        data: action_string, 
        success: function(result){ 
         $('div#append_result').append(initval + ',<br/>'); 
        } 
       }); 
    initval++; 
    } while (initval <= endval); 
    } 
</script> 

ある

んが: 5、 5、 5、 5、 5、

と私は出力する必要があります 1、 2、 3、 4、 5、

答えて

6

AJAXの非同期性のため、結果のAJAX要求に対して成功関数が実行されるまでには、ループは完了し、initvalは5に設定されます。各要求の開始時にinitvalの状態を取得する必要がありますキャプチャした状態をsuccess()メソッドで使用します。

function action() { 
    var initval = 1; 
    var endval = 5; 
    do { 
     var action_string = 'txtuser=someone'; 

     (function(captured_initval){ 
      $.ajax({ 
       type: "POST", 
       url: "http://localhost/js.php", 
       data: action_string, 
       success: function(result){ 
        $('div#append_result').append(captured_initval + ',<br/>'); 
       } 
      }); 
     }(initval)); 

     initval++; 
    } while (initval <= endval); 
} 

は、1つまたは複数の要求が1, 2, 5, 3, 4か何かにつながる可能性が最初に完了するために、後者の要求を許可するサーバー、でハングアップを取得できることが、しかし、理解する:値の上に閉じると、それを行うための最も簡単な方法です。そうですね。

また、要素のIDを使用すると、ハッシュセレクタの先頭にelementsタグ名を付けるよりもはるかに高速です。さらに、成功が実行されるたびに結果DIVのためにDOMに再クエリするのを避けるべきです。一度それをつかむし、必要なときにそれを使用します。

function action() { 
    var initval = 1; 
    var endval = 5; 
    do { 
     var action_string = 'txtuser=someone', 
      $AppendResult = $('#append_result'); 

     (function(captured_initval){ 
      $.ajax({ 
       type: "POST", 
       url: "http://localhost/js.php", 
       data: action_string, 
       success: function(result){ 
        $AppendResult.append(captured_initval + ',<br/>'); 
       } 
      }); 
     }(initval)); 

     initval++; 
    } while (initval <= endval); 
} 
+1

あなたは* interval *の値を「上書き」していません。まだ存在しているクロージャの影響を避けています。 – RobG

+0

元の閉鎖の影響を避けることは間違いありません。しかし、私は好きな効果を持つクロージャーで新しいスコープを作成することでそうしていませんか?成功コールバックは、私が作成した直後に呼び出された関数式の内部にあり、 "捕捉された"値が閉じられる原因であることを忘れないでください。 – JAAulde

+1

非常に非常にありがとう、すべてが助けになる!! – blackriderws

3

Ajaxリクエストが成功ハンドラが復帰すると、ループが既に完了した時点で意味し、非同期です。代わりに、あなたは価値を維持するためにクロージャを作成することができます。

success: (function(i){ 
    return function() { 
     $('div#append_result').append(i + ',<br/>'); 
    } 
})(initval) 
+1

これはクロージャではなく、クロージャの効果を回避しています。無名関数はまだinitvalへのクロージャを持っています。 – RobG

+0

@RobG - 私は自分の答えに対するコメントに答えて言ったように、私は尊重しています。 – JAAulde

+0

@JAAulde - 実際に私たちは同意します。しかし、余分な閉鎖は副作用であり、元の閉鎖が壊れている理由ではありません。言い換えれば、現在は機能しているということは、余分なクロージャが原因ではなく、値を別の関数に渡すためである(値がプリミティブなので)。 – RobG

2

は、これは、AJAXの非同期動作は次のとおりです。ここで は修正版です:

var initval = 1; 
var endval = 5; 
function action(){ 
    var action_string = 'txtuser=someone'; 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost/js.php", 
     data: action_string, 
     success: function(result){ 
      $('div#append_result').append(initval + ',<br/>'); 
      initval++; 
      if(initval<=endval) 
      action(); 
     } 
    }); 
} 

これはやや今シーケンシャルなアプローチであります。 注:私はすべてのAjaxリクエストが成功を返すと仮定しました。エラーがある場合、エラーコールバックでそれらを処理する必要があります。

関連する問題