我相信我还没有完全掌握jQuery中的变量范围,需要一些帮助来理解为什么变量“final_shasign”在AJAX中很好,但在AJAX之外是未定义的,尽管它是在AJAX之外声明的。
var final_shasign; // initial declaration outside of ajax block below
$.ajax({
type: "POST",
url: "sha.php",
data: "amount="+amount+"&cn="+cn+"¤cy="+currency+"&language="+language+"&orderid="+orderid+"&pspid="+pspid,
success: function(response_data, final_shasign){
var parsed_data = $.parseJSON(response_data);
final_shasign = parsed_data.shasign;
console.log ("inside nested ajax: " + final_shasign); //comes out fine
}
});
console.log ("outside of nested ajax: " + final_shasign); //comes out as undefined!
答案 0 :(得分:3)
这是因为在AJAX响应返回并更新变量值之前之前正在执行AJAX语句之外的console.log()
AJAX is asynchronous所以AJAX语句之后的代码将在响应有可能从“sha.php”返回之前运行。
如果您希望阻止请求异步执行,可以在async:false
方法上设置$.ajax()
。
$.ajax({
type: "POST",
url: "sha.php",
data: "amount="+amount+"&cn="+cn+"¤cy="+currency+"&language="+language+"&orderid="+orderid+"&pspid="+pspid,
async: false,
success: function(response_data, final_shasign){
var parsed_data = $.parseJSON(response_data);
final_shasign = parsed_data.shasign;
console.log ("inside nested ajax: " + final_shasign); //comes out fine
}
});
But this isn't recommended!应该在success
回调函数中调用任何依赖于AJAX响应的javascript。
var final_shasign;
$.ajax({
type: "POST",
url: "sha.php",
data: "amount="+amount+"&cn="+cn+"¤cy="+currency+"&language="+language+"&orderid="+orderid+"&pspid="+pspid,
async: false,
success: function(response_data, final_shasign){
var parsed_data = $.parseJSON(response_data);
final_shasign = parsed_data.shasign;
console.log ("inside nested ajax: " + final_shasign); //comes out fine
Func();
}
});
function Func(){
console.log ("outside of nested ajax: " + final_shasign);
}
答案 1 :(得分:1)
AJAX是异步的,所以当你尝试读取ajax回调函数之外的变量值时,它仍然是undefined
。
因此,在回调函数中使用变量值对您的逻辑进行编码,这里是success
回调。
您也可以使用deferred对象。
答案 2 :(得分:0)
你可以这样尝试
success: function(response_data, final_shasign){
var parsed_data = $.parseJSON(response_data);
final_shasign = parsed_data.shasign;
passFinalvalue(final_shasign)
console.log ("inside nested ajax: " + final_shasign); //comes out fine
}
function passFinalvalue(getval)
{
//do your stuff
}