2

私は次のコードを持っています:

$("#submit_financials").live('click', function(event){
    event.preventDefault();

    // using serialize here to pass the POST variables to the django view function
    var serialized_data = $("#financials_filter_form").serialize()

    $.post("/ajax/custom_filter/", serialized_data, function(response){
        // create a graph
    });
    $.post("/ajax/force_download/", serialized_data, function(response){
        alert('hello');
    });

});

ただし、このコードを実行すると、グラフの前に「hello」という応答が返されます。なぜこうなった?そして、最初にグラフを取得するようにこれをどのように変更しますか?

4

3 に答える 3

6

非同期、どの関数が最初に実行/終了するかを知ることはできません...

人々のグループに1マイル走るように指示するような非同期操作について考えてみてください。誰が最初に終了するか知っていますか?(はい、ジョン・スキート、次にチャック・ノリス...)

callackを使用して、2番目のajaxを実行できます。

$.post("/ajax/custom_filter/", serialized_data, function(response) {
    // create a graph
    ...
    ...

    $.post("/ajax/force_download/", serialized_data, function(response) {
        alert('hello');
    });
});​
于 2012-06-05T17:58:07.243 に答える
5

アラートの前にグラフを生成したいが、両方の呼び出しを完了させたい場合は、遅延オブジェクトの使用を試すことができます。

$.when (
   $.post("/ajax/custom_filter/", serialized_data),
   $.post("/ajax/force_download/", serialized_data)
).done(function(a1,  a2){
    /* a1 and a2 are arguments resolved for the 
    custom_filter and force_download post requests  */
   var customFilterResponse = a1[2]; 
   /* arguments are [ "success", statusText, jqXHR ] */

   //generate graph.

   alert('hello');
});
于 2012-06-05T18:03:51.750 に答える
0

オプション1は、投稿リクエスト(gdoronの応答)をネストすることです。これが不可能/実用的でない場合は、相互スコープの変数をフラグとして使用できます(応答コールバック関数で値を変更してから、setTimeoutとrecursion(またはsetInterval)を使用して、「フラグ」変数の変更を探し続けます。変更が表示されたら、次の$.postリクエストをポップします

于 2012-06-05T18:01:18.983 に答える