0

可能重复:
jQuery 全局变量问题

我正在做一个 jQuery AJAX 调用,我想将响应保存到一个变量中。但是,此变量不具有 AJAX 调用函数之外的响应值。如何在 AJAX 调用函数之外获得响应?

例子:

var responseText = '';
$.ajax({
    url: 'clients_handler.php',
    type: 'post',
    data: { action: 'check_email', email: email },
    success: function(data) {
        responseText = jQuery.parseJSON(data);
    }
});
console.log(responseText);

因此,在我的示例responseText中,AJAX 函数之前设置为空。如何使用 AJAX 响应值设置此变量?

4

2 回答 2

1

您无法以您想要的方式保存变量,因为它位于闭包内。您可以做的最好的事情是将响应数据传递给将在请求完成后执行的函数。这是一个例子:

//code
$.ajax({
    url: 'clients_handler.php',
    type: 'post',
    data: { action: 'check_email', email: email },
    success: function(data) {
        responseHandler(data);
    }
});


function responseHandler(data){
    console.log(data);
}
于 2013-01-10T14:51:11.513 回答
1

简单的答案是 ajax 异步触发。本质上,这意味着您不知道 ajax 代码何时完成,因此调用之后$.ajax的任何代码行都可能在完成之前执行$.ajax(但不一定)。这就是为什么需要 ajax 回调的原因。

一种解决方案是使用jQuery.ajaxoption使 ajax 请求同步async: false,但这可能不是我们所希望的。

responseText真正的解决方案是适当地使用回调——在函数中做所有你需要做的工作success:

不喜欢将所有代码集中在一个地方?jQuery 很好地创建了 Deferred 并jqxhr实现了它:

var jqxhr = $.ajax({url: url, data: data});
//thousands of lines of code here
$.when(jqxhr).done(function (responseText) { console.log(responseText); });
于 2013-01-10T14:51:51.787 回答