2016-05-19 5 views
3

データベース(ajax)をリクエストする必要があるjavascriptコードがあります。しかし、挿入が間違っているが、正しいSQLリクエストがあることがわかりました。そこで、コードがいつ実行されるのかを知るために、どのajaxリクエストにアラートを追加しました。ここでオーダーリクエストの順番は常に異なる

コードは次のとおりです。

$.post("/kohana-v3.3.5/ajax/update_simulation", { 
        id_simulation: id_simulation, 
        nom_simulation: nom_simulation, 
        sol_simulation: sol_simulation, 
        station_simulation: station_simulation, 
        iteration_simulation: iteration_simulation, 
        scenario_simulation: scenario_simulation 
       } 
       , function (result) { 
        console.log(result); 
        alert('update'); 
       }); 

$.post("/kohana-v3.3.5/ajax/delete_pousses", {id_simulation: id_simulation}, function (result) { 
       console.log(result); 
       alert('delete'); 
      }); 

$(this).prev('div').find('table .formRows').each(function (i) { 
          alert('here'); 
          if (cpt % 2 == 1) { 
           //interculture 
           var $tds = $(this).find('td option:selected'), 
            culture = $tds.eq(0).val(), 
            date = $tds.eq(1).text(); 
           itk = null; 
          } else { 
           //culture 
           var $tds = $(this).find('td option:selected'), 
            culture = $tds.eq(0).val(), 
            itk = $tds.eq(1).val(); 
           date = null; 
          } 

          $.post("/kohana-v3.3.5/ajax/insert_pousses", { 
           id_simulation: id_simulation, 
           culture: culture, 
           date: date, 
           itk: itk, 
           rang: cpt 
          }, function (result) { 
           console.log(result); 
           alert('insert'); 
          }); //Fin du post 

          cpt++; 


         }); //Fin du each 

私はそのコードを実行するたびに、警告の順序は常に違います!時には "insert update delete"、時には "update、delete insert" ...

削除が最後のものであれば、挿入が削除されるので問題です。それで、それは普通のやり方ですか?どのように解決すればいいですか?

+0

'ajax'の' a'は '非同期'を表します。つまり、投稿要求の実行は順番に実行されません。どちらが最速になるかが最初に戻るでしょう。 – Jack

答えて

3

AJAXリクエストは非同期であるので、あなたは、このような兄弟としてそれらをトリガーする場合は、順序を保証することはできません。

固定注文を保証するには、前任者の成功ブロックから後続の呼び出しを行う必要があります。このような何か:

$.post('/ajax/method1', { params: params }, 
    function(result) { 
    $.post('/ajax/method2', { params: params }, 
     function(result) { 
     $.post('/ajax/method3', { params: params }, 
      function(result) { 
      }); 
     }); 
    }); 
+0

私は試みましたが、3番目の 'post'は実際にはテーブルをループする関数の中にあります。私はあなたのために私のポストを編集しました。 – Erlaunis

+0

@ Erlaunisそれは同じように動作するはずです。あるいは、それらを完全に異なる機能に分割し、各機能を順に呼び出すこともできます。 – GalacticCowboy

+0

私はajaxのsuccess関数の中で '$(this) 'に問題がありました。しかし、私はそれを修正しました!ありがとう:) – Erlaunis

4

JavaScriptを非同期で実行することができます。これが、あなたのajaxリクエストが常に同じ順序で実行されるわけではありません。あなたはasnyc false(ここではjQuery: Performing synchronous AJAX requestsのような)を設定するか、約束(https://api.jquery.com/promise/)のようなものを作って、ajax呼び出しが完了するのを待つことができます。

挨拶

1

あなたは前の1つの成功によってポストajaxメソッドを呼び出す必要があります。

よう

:あなたがする.promiseを使用することができます

$.post("/kohana-v3.3.5/ajax/update_simulation", { 
       id_simulation: id_simulation, 
       nom_simulation: nom_simulation, 
       sol_simulation: sol_simulation, 
       station_simulation: station_simulation, 
       iteration_simulation: iteration_simulation, 
       scenario_simulation: scenario_simulation 
      } 
      , function (result) { 
       console.log(result); 
       alert('update'); 
    dleteajax(); 
      }); 

function dleteajax() 
{ 
$.post("/kohana-v3.3.5/ajax/delete_pousses", {id_simulation: id_simulation},    function (result) { 
      console.log(result); 
      alert('delete'); 
     }); 
    } 
3

「コレクションにバインドされた特定のタイプのすべてのアクションは、キューに入れられたりないとき観察は、終了しました。」更新

function CallingFunction() 
{ 
    var promise = testFunction(); 

    promise.then(function (data) { 

     //do bits/call next funtion 
    } 
} 

関数を呼び出す

https://api.jquery.com/promise/

例機能

function testFunction() { 
    var deferred = $.Deferred(); 

    $.ajax({ 
     type: "POST", 
     url: "", 
     success: function (data) { 

      deferred.resolve(data); 
     } 
    }); 
    return deferred.promise(); 
} 

"すべてのAjaxリクエストが完了したときに呼び出されるハンドラを登録してください。"

https://api.jquery.com/ajaxStop/

$(document).ajaxStop(function() { 

}); 

最後の注意:

のjQuery 1.8の時点で、非同期の使用:falseは$ .Deferredで使用し、推奨されていません。

+0

私はGalacticCowBoyのソリューションを使用しましたが、あなたが話す機能はすべて面白いです。ありがとう! – Erlaunis

関連する問題