2014-01-13 115 views
2
$("#container").on("change", "#control1", function() { 
    if ($("#checkData").val()) { 
     $.get("/Controller/CheckData/" + $("#control2").val(), function(data1) { 
     if(!data1.Success) { 
      alert("Unable to do POST.");   
      return; 
     }); 
    }; 
    formData = $("#form").serialize(); 
    $.post("/Controller/PostData", formData, function(data2) { 
     // Do something... 
    }); 
} 

如果checkData爲false,則表單應該發佈。如果checkData爲true,則只有在get返回true時纔會發佈該表單。異步Ajax邏輯

這似乎不起作用,因爲表單在警報對話框仍處於打開狀態時發佈。我認爲這可能是由於AJAX的異步性質。它是否正確?

+4

請在你的問題上寫上更好的標題。目前的標題可能是一本書的名字。 –

+0

我一直在努力爲此命名。再給我幾分鐘。 –

+6

答案是:是的。 – asawyer

回答

2

是的,這個帖子總是會發生,因爲你沒有做任何事情來阻止它。如果您希望基於$ .get的結果發送或不發送帖子,則需要將其移至get回調函數fn。

此外,你的代碼充滿了語法錯誤,但我懷疑他們中的許多人是複製粘貼錯誤,否則你甚至不會得到警報。

$("#container").on("change", "#control1", function() { 
    if ($("#checkData").val()) { 
     $.get("/Controller/CheckData/" + $("#control2").val(), function (data1) { 
      if (!data1.Success) { 
       alert("Unable to do POST."); 
      } else { 
       var formData = $("#form").serialize(); 
       $.post("/Controller/PostData", formData, function (data2) { 
        // Do something... 
       }); 
      } 
     }); 
    } 
}); 
+0

好吧,這裏的交易... 上面的帖子運行約10行代碼長。我試圖找到避免重複兩次的方法。 –

+1

我不明白你的意思,它不會重複.. –

+0

關於第二個想法,它被修改的方式,我想我可以避免這一點。 有一個如果之前的第一個如果其次是另一個和兩個如果,但我認爲這使我朝着正確的方向。 –

1

是的,你總是得到$ .post ...

3

是的。當您調用$.get()方法時,代碼將繼續執行。這意味着它會立即進入下面的聲明和$.post()調用。如果您想等到$.get()調用完成後才執行這些操作,則需要將它們放入回調函數中。

1

是的。而你cannot return from a callback。你需要做的

$("#container").on("change", "#control1", function() { 
    if ($("#checkData").val()) { 
     var formData = $("#form").serialize(); 
     $.get("/Controller/CheckData/" + $("#control2").val(), function (data1) { 
      if (!data1.Success) 
       alert("Unable to do POST."); 
      else 
       $.post("/Controller/PostData", formData, function (data2) { 
        // Do something... 
       }); 
     }); 
    } 
}); 

順便說一句,這可能是不安全的依賴於數據的客戶端檢查(即使通過ajaxing /CheckData/)「允許」 POST請求前。如果您需要兩步處理,則應從GET請求中返回「安全」令牌。

+0

我試圖從頁面中拉出一個數字,在數據庫中查找它,以確定該帖子是否被允許。這是一個拖放操作,所以它必須允許/禁止一個動作的放下。 –

+0

如果客戶端沒有查看任何內容,就會向服務器發送一些任意數據,會發生什麼情況? – Bergi

1

請注意,這兩條線在你的代碼反轉(因此不匹配):

$("#container").on("change", "#control1", function() { 
    if ($("#checkData").val()) { 
     var c2 = $("#control2").val(); 
     $.get("/Controller/CheckData/" + c2, function(data1) { 
     if(!data1.Success) { 
      alert("Unable to do POST.");   
      return; 
     } <=== HERE 
     }); <=== HERE 
    }; 
    formData = $("#form").serialize(); 
    $.post("/Controller/PostData", formData, function(data2) { 
     // Do something... 
    }); 
} 

我從$不用彷徨線路中抽取無功C2只看到括號更容易,而不是任何其他原因。

+0

我想發佈實際的代碼(我應該首先完成),但我不確定是否應該編輯頂部帖子或將其添加到底部。 –