关于asp.net:jQuery Ajax调用 – 设置变量值成功

jQuery Ajax call - Set variable value on success

本问题已经有最佳答案,请猛点这里访问。

我正在编写的应用程序修改服务器中缓存对象上的数据。修改是通过一个Ajax调用执行的,该调用基本上更新了该对象的属性。当用户完成工作后,我有一个基本的"保存更改"按钮,允许他们保存数据并刷新缓存的对象。

为了保护用户,我希望在对服务器对象进行了修改(如果尚未保存)时,如果尝试离开页面,则向他们发出警告。因此,我创建了一个名为IsInitialized的Web服务方法,它将根据是否保存了更改返回true或false。如果他们没有被保存,我想提示用户并给他们一个机会取消他们的导航请求。

这是我的问题-虽然我的调用工作正常,但我似乎无法获得Ajax成功调用来设置其回调函数的变量值。这是我现在的密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   ////Catches the users to keep them from navigation off the page w/o saved changes...
window.onbeforeunload = CheckSaveStatus;
var IsInitialized;

function CheckSaveStatus() {

    var temp = $.ajax({
        type:"POST",
        url:"URL.asmx/CheckIfInstanceIsInitilized",
        data:"{}",
        contentType:"application/json; charset=utf-8",
        dataType:"json",
        success: function(result) {
            IsInitialized = result.d;
        },
        error: function(xmlHttpRequest, status, err) {
            alert(xmlHttpRequest.statusText +"" + xmlHttpRequest.status +" :" + xmlHttpRequest.responseText);
        }

    });

    if (IsInitialized) {
        return"You currently have unprocessed changes for this Simulation.";
    }
}

我觉得我可能试图以不适当的方式使用成功回调。如何在success回调上设置一个javascript变量,以便我可以决定是否应通过未保存的更改消息提示用户?

正如前面所指出的,我正在进行异步调用,这意味着在我的方法返回之前调用了其余的代码。是否有方法使用该Ajax调用,但仍捕获window.onUnload事件?(不使用Synchronos Ajax)


由于在卸载事件中需要这种行为,因此必须进行同步调用。但是,它可能会冻结浏览器窗口/选项卡,这取决于调用需要多长时间,但因为您正在有效地阻止用户关闭窗口…

向JSON中添加async: false以进行同步调用。


jquery页面示例:

1
2
3
4
var html = $.ajax({
  url:"some.php",
  async: false
 }).responseText;

来源:http://api.jquery.com/jquery.ajax/


问题是对Ajax调用的请求是异步的。因此,当您检查您是否已初始化时,调用尚未完成。

我建议在成功功能中指定您的行为。

基本上,使用Ajax进行同步调用是不可能的,而不是真正令人气馁的。


我在尝试通过Ajax请求的成功回调为数据对象设置属性时遇到了类似的问题。使用async: false也没有解决我的问题。我最后做的是在Ajax调用之外使用setTimeout调用,并将超时值设置为1,如下所示:

1
2
3
4
5
6
7
8
9
10
11
function getSessionid() {  
    $.ajax({  
        type: 'POST',  
        url: 'getSession.php',  
        dataType: 'text',  
        success: function(result){myData.sessionid = result;},  
        error: function(data) {alert("Error!
"
+ data);}
    });  
    setTimeout(function() {alert('sessionid = ' + myData.sessionid);},1);  
}

仅仅是1毫秒的延迟就造成了世界上所有的不同。如果没有它,sessionid属性就不会在Ajax调用之外设置,尽管回调中的警报显示它确实被设置了。如果你遇到类似的问题,这是一个值得思考的问题。


从理论上讲,您可以终止事件(返回false)并在成功时关闭窗口,但我认为您会遇到一些用户设置的javascript限制,也会混淆他们为什么不关闭窗口。所以,我同意PawelKrakowiak的观点,Ajax调用本身必须是同步的。

我要补充的是,您要给用户一些通知,说明您正在检查状态(请不要弹出窗口)。窗口顶部的一个漂亮的通知横幅),确保将$.Ajax"Timeout"选项设置为更合理的选项,这样他们就不会永远等待窗口关闭。


看起来对我来说最好的方法是在Ajax调用上使用async:false选项。尽管我理解拉沙克对这一点的犹豫,但我认为这种情况证明了这种手段的正当性。

杰尔夫也提出了一个很好的观点,那就是确保在我试图验证用户状态时不会让用户挂起。超时选项的耦合非常重要。

感谢所有评论的人。


请参见这里:

http://groups.google.com/group/jquery-dev/browse ou thread/thread/40d0e3def47148a0