1

シナリオは次のとおりです。Webサーバーを介してデータベースからデータを取得しています。そのデータページに基づいて、同じサーバーに別のリクエストを送信して、何らかのアクションを実行します。簡略化された構造は次のとおりです。

var datacon;
$.post('method',function(data){
   datacon = data;
   // populating some tags;
}) // end of post
//some other staff happening;
$.post('other',{datacon}, function(env){
...// taking data from populated tags
   $("div").load(env);
...
}) // end of post

これは、ユーザーがページに入るたびに発生します。このコードは、ページを開いたときにdataconが空であるという意味では機能しません。しかし、1、2回更新すると、動作を開始します。2番目の$.postは完全に機能し、何百回もチェックされます。最初の$.postを$.getに変更しましたが、役に立ちません。

おそらくそれは非同期/同期呼び出しに関係しています。なぜそれが起こるのかよくわかりません。助けてください。

psサーバーはCherryPyです。

4

2 に答える 2

1

これらの呼び出しは非同期であるため、最初の呼び出しが完了する前に2番目の呼び出しが実行されている可能性があります。それらが正しい順序で実行されるようにするには、最初のajax呼び出しをdone()関数の最初の呼び出しの最後に配置します。そうすれば、2番目は最初が終了したときにのみ実行されます。

これが私が取り組んでいるプロジェクトからのサンプルです:

    $( "#leftcolumn")。activity();
    $ .ajax({
            タイプ:「GET」、
            url: "/ search"、
            キャッシュ:false、
            データ:{searchterm:searchterm}
            })。done(function(reply){
                $( "#leftcolumn")。activity(false);
                showSearchResults(reply);
                });

最初の行には、画面に進行状況インジケーターが表示されます。次に、ajax呼び出しが検索を実行します。.doneの最後で、表示していた進行状況インジケーターを無効にして、検索結果を表示します。実行したいコードを.doneに入れると、ajax呼び出しが終了するまで実行されないことが保証されます。

于 2012-08-08T19:36:52.780 に答える
1

コールバック関数は非同期で実行されます。つまり、サーバーからデータが受信されると実行されます。最初の POST からの応答が返される前に、2 番目の POST が実行されている可能性があります。最初の post() を ajax() に変更し、「async」を「false」に設定できます。http://api.jquery.com/jQuery.ajax/を参照してください。

ただし、上記は少し厄介です。理想的には、AJAX 呼び出しの結果に依存するものはすべて、コールバック メソッドに入れる必要があります。たとえば、最初の POST のコールバック内に 2 番目の POST を移動してみてください。あなたがしようとしているようなフラグの設定は、コードの匂いと見なすことができます。

于 2012-08-08T19:35:17.193 に答える