我正在努力避免剪切和粘贴代码,因此我制作了一个将数据保存到网络服务器的包装器:
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。如果成功添加了数据,则Web服务器返回一个整数值,如果发生错误,则返回一些文本。
发送和返回的数据以字节为单位测量......绝对最差情况为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 );
});
答案 0 :(得分:1)
不确定这是否会让您认为它不是同步的,但是您的函数永远不会返回-1
,因为您将return
语句放在success:
回调中。相反,它应该将-1
分配给anID
。
success: function (sReturn) {
anID = parseInt(sReturn);
if (isNaN(anID)) {
$("#Status").html("Error: " + sReturn);
anID = -1; // do an assignment
}
}
}); //end AJAX call
return anID;