我试图避免剪切和粘贴代码,所以我制作了一个用于将数据保存到网络服务器的包装器:
function saveData(newData) {
//clear our error message out.
$("#Status").html("");
var anID;
//save the data to the server
$.ajax({
type: "POST",
url: "/John/SaveSomeData",
data: JSON.stringify(newData),
async: false,
contentType: 'application/json; charset=utf-8',
datatype: "json",
traditional: false,
success: function (sReturn) {
anID = parseInt(sReturn);
if (isNaN(anID)) {
$("#Status").html("Error: " + sReturn);
return -1;
}
}
}); //end AJAX call
return anID;
} //end save data
基本上,上面的函数如果有效则返回一个正整数,如果它从服务器收到错误则返回-1。如果数据被成功添加,网络服务器将返回一个整数值,如果发生错误,则返回一些文本。
发送和返回的数据以字节为单位......绝对最坏的情况是 200 字节(是的,字节,不是千字节、兆字节或千兆字节......只是字节)所以我不关心很多的可能性正在发送的数据以及处理它的时间。
我使用上面的代码如下(一个在添加按钮中,另一个在保存按钮中):
$("#addButton").click(function (event) {
//validate data locally
//cut some unimportant code
var newData = /*newdata junk cut*/
var myID = saveData(newData);
if (myID != -1) {
//cut code for adding result to a list
//snip the rest of the code
我遇到的明显问题是 jquery 触发 ajax 调用并继续不等待 ajax 调用完成。基本上,服务器可以返回“添加失败”并且“添加按钮事件”将继续处理,就像它成功一样。
发送到网络服务器的数据很好,处理正确,并且来自网络服务器的响应是正确的。这纯粹是同步/异步问题,而不是与服务器之间的数据。
我的理解是“async:false”行应该强制 jquery 在执行任何其他操作之前等待 ajax 调用完成。
添加与保存时发生的事情的编码不同,因此我不希望将代码与 Ajax 一起使用。
我是否需要将 ajax 部分转换为更像:
var ajaxReturn = $.ajax({
type: "POST",
url: remote_url,
async: false, }).responseText;
ajaxReturn.done(function(msg) {
$("#log").html( msg );
});
ajaxReturn.fail(function(jqXHR, textStatus) {
alert( "Request failed: " + textStatus );
});