有什么方法可以在$.post()
之外使用data_response
?
这是我使用的代码的一部分:
$.post('do.php', { OP: "news_search", category: cat_id },
function(data_response){
var response = data_response; //I need to access this variable outside of $.post()
}
}, "json");
console.log(response); //response is not defined, is what I get for now
更新
难道没有办法在全球范围内获得这种响应吗?
No; $.post
异步执行,因此当您调用 console.log
时,AJAX 请求仍在运行,尚未产生响应。这就是回调函数的目的:提供要在请求完成后运行的代码。如果将console.log
移动到回调函数中,它应该可以工作:
$.post('do.php', { OP: "news_search", category: cat_id },
function(data_response){
var response = data_response; //I need to access this variable outside of $.post()
console.log(response);
}
}, "json");
更新:如果您希望响应数据全局可用,则可以在全局范围内声明变量,如下所示:
var response = null;
$.post('do.php', { OP: "news_search", category: cat_id },
function(data_response){
response = data_response;
console.log(response);
}
}, "json");
当然,唯一可以确定response
有的上下文实际上填充了一个值是在提供给的回调函数中 $.post
行后response = data_response;
.如果您想在脚本中的任何其他阶段,您必须先检查其值;像这样:
if (response !== null)
{
console.log(response);
}
请注意,如果您将其直接放在之后,此代码将无所事事$.post
电话;只有在 POST 请求完成后,在其他异步回调(可能是某种 UI 交互事件(中执行时,它才有用。
只需在回调之外声明变量,使其作用域限定为可以从中访问它的代码的一部分:
var response;
$.post('do.php', { OP: "news_search", category: cat_id },
function(data_response){
response = data_response;
}
}, "json");
console.log(response); //response is now defined - It won't be populated yet though.
如上面的代码所示,尽管将定义响应,但它不会在您调用 console.log 时填充,但是如果您在回调触发后的某个时间点访问该变量,它将被填充。
如果你沿着这条路走下去,你可能希望使用模块模式或闭包来避免将响应变量放在全局范围内(你可能想公平地这样做(
克罗克福德的模块模式:http://www.yuiblog.com/blog/2007/06/12/module-pattern/
您可以使用 a 变量,并在脚本中的任何位置检查 done((,如果完成,它将立即执行,如果没有,它将在 ajax 调用完成后执行。
var XHR = $.post('do.php', { OP: "news_search", category: cat_id },
function(data_response){
// do somehing with data_response
}
}, "json");
function doSomethingElse() {
XHR.done(function(response) {
console.log(response);
});
}
如果您需要在 $.post(( 之外使用响应,并且需要确保在 $.post(( 调用之后立即填充此值,您可以尝试以同步方式进行"POST"调用。这不能用 $.post(( 做,但用 $.ajax(( 做
:var returnedData = null;
$.ajax({
type: 'POST',
url: 'do.php',
data: { OP: "news_search", category: cat_id },
success: function (response) {
returnedData = response;
},
dataType: "text"
});
console.log(returnedData );
我让它像这样工作:
var returnedData = {}; //Declaring Object var not just var
$.ajax({
type: 'POST',
url: 'do.php',
data: { OP: "news_search", category: cat_id },
success: function (response) {
returnedData.result1=response; //Add response into the Object created outside the ajax
},
dataType: "json"
});
console.log(returnedData);//inside it you can get returnedData.result1