0

我试图避免剪切和粘贴代码,所以我制作了一个用于将数据保存到网络服务器的包装器:

 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 ); 
});
4

1 回答 1

1

不确定这是否是让您认为它不同步的原因,但您的函数将永远不会返回-1,因为您将该return语句放在success:回调中。相反,它应该分配-1anID.

    success: function (sReturn) {
        anID = parseInt(sReturn);
        if (isNaN(anID)) {
            $("#Status").html("Error: " + sReturn);
            anID = -1; // do an assignment
        }
    }
});    //end AJAX call
return anID;
于 2012-04-09T20:17:47.987 回答