0

我相信我还没有完全掌握 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+"&currency="+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!
4

3 回答 3

3

这是因为在 AJAX 响应返回并更新变量值之前console.log(),您的 AJAX 语句外部正在执行。

AJAX 是异步的,因此 AJAX 语句之后的代码将在响应有机会从“sha.php”返回之前运行。

如果您希望阻止请求异步执行,您可以async:false$.ajax()方法上进行设置。

$.ajax({
    type: "POST",
    url: "sha.php",
    data: "amount="+amount+"&cn="+cn+"&currency="+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
    }
});

但这不推荐!相反,任何依赖于 AJAX 响应的 javascript 都应该在success回调函数中调用。

var final_shasign;

$.ajax({
    type: "POST",
    url: "sha.php",
    data: "amount="+amount+"&cn="+cn+"&currency="+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);
}
于 2013-07-03T10:05:17.837 回答
1

AJAX 是异步的,因此当您尝试在 ajax 回调函数之外读取变量的值时,它仍然是undefined.

因此,使用回调函数中的变量值对您的逻辑进行编码,这里是success回调。

您也可以使用延迟对象。

请阅读:如何从异步调用返回响应?

于 2013-07-03T10:05:11.960 回答
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
}
于 2013-07-03T10:07:53.903 回答