2009-03-20 9 views
0

私はjQueryのアヤックスコールがあります。最初の.ajax呼び出しの結果に基づいて別のjQuery .ajax呼び出しを開始する方法はありますか?

$j.ajax({ 
     type: "POST", 
     url: "/Services/Cart.asmx/UpdateQuantity", 
     data: data, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(msg) { 
      var d = msg.d; 

      // etc. 
     }, 
     error: function(xhr, msg) { 
      var response = JSON.parse(xhr.responseText); 
      var cart = $j('#cart'); 
      if (response.Message) { 
       cart.before(' <div class="error">' + response.Message + '</div> '); 
      } 
      else { 
       cart.before(' <div class="error">An unexpected error occurred.</div> '); 
      } 
     }, 
     complete: function(request, settings) { 
      // Some other stuff. 
     } 

    }); // end ajax 
    alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.') 

をしかし、この最初のAJAX呼び出しによって返された一部のデータに基づいて、私は2番目のアヤックス通話を開始します。しかし、コールバックが最初のものに対してどのように設定されているかによって、順番に(つまり、上記の最後のアラート( '最初...)'の行のどこに)発生しないのでしょうか?最新の更新されたクライアント側のDOMデータ

別の.ajaxコールを送信するにはどうすればよいですか?私はすぐに完全なイベントの中でいくつかのテストをしましたが、それは行き過ぎではないようです。

「jQuery in Action」は、ここでは、何が起こっているのかを理解するために時間を捜すのを待っていますが、まだ時間はありません。

UPDATE:Erk。明白なものが最初に期待どおりに機能しないとき、問題は通常、椅子とモニターの間にあります。私はこれを全裸の脳のおならに置く。私が元々どのように設定していたのか(成功コールバックの中で2番目の.ajax呼び出しを呼び出すことは非常に明白でしたが、2番目の.ajax呼び出しには小さな構文エラーがありました。 )。

そして、私が最初に行ったことで、@ kgiannakakisが答えとして注目されていました。そして、あなたは控えめに過小評価された "あなたは同期を設定することができますが、これは推奨されるテクニックではありません。

答えて

2

アラートはajaxコールの後ではなく、成功のコールバックに入る必要があります。 ajax呼び出しのデフォルトの動作は非同期です。つまり、コールはすぐに戻り、データが実際に受信された時点でコールバックが後で呼び出されます。

コールを同期に設定することはできますが、これは推奨される方法ではありません。

3

最初の結果に基づいて別のajaxリクエストを作成したい場合は、別の関数で2番目のajaxリクエストが必要です。そのほかの関数は、最初のajaxリクエストの成功イベントに対して呼び出されます。私はそれが正しいだことを確認するために、これをテストしていないにもかかわらず、このような 何か、:

$j.ajax({ 
    type: "POST", 
    url: "/Services/Cart.asmx/UpdateQuantity", 
    data: data, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: newSuccessFunction(xhr,msg), 
    error: function(xhr, msg) { 
     var response = JSON.parse(xhr.responseText); 
     var cart = $j('#cart'); 
     if (response.Message) { 
      cart.before(' <div class="error">' + response.Message + '</div> '); 
     } 
     else { 
      cart.before(' <div class="error">An unexpected error occurred.</div> '); 
     } 
    }, 
    complete: function(request, settings) { 
     // Some other stuff. 
    } 

}); // end ajax 

function newSuccessFunction(xhr,msg) { 
    var d = msg.d; 
    //... etc. 
    $.ajax({ //... 
      }); 
    alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.') 
}