2014-01-13 74 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

我想发布实际的代码(我应该首先完成),但我不确定是否应该编辑顶部帖子或将其添加到底部。 –