$ .post的Jquery和范围问题

时间:2011-06-03 03:48:03

标签: ajax jquery

我的代码遇到一个小问题。我正在向我的页面发送POST请求,在完成后它应该返回“OK”,这意味着它有效。从我的处理函数里面我调用set_var(data)来设置我的全局变量文本,但问题是我的print_info()返回undefined。

我花了很多时间在这上面,并意识到我的问题与某种方式有关,但我不知道如何解决它。如果有人能提供任何指示,那就太好了。

<?
if($_REQUEST['action'] == 'test')
{
    echo "OK";
    die;
}

?>

<script type="text/javascript" src="jquery-1.6.1.js" ></script>

<script type="text/javascript">
var ajax_post_result;

function set_var(data)
{
    //PRINTS MY TEXT OK
    alert("SET:: " + data);

    //SET TO MY GLOBAL VARIABLE
    ajax_post_result = data;

    //ALSO PRINTS OK
    alert("SET2:: " + ajax_post_result);
}

function return_handler(data, textStatus)
{
    //THESE BOTH WORK ... BUT ONLY HERE AND WITHIN set_var()
    //alert("1: " + data); //PRINTS WHAT I NEED

    //CALL FUNCTION TO SET GLOBAL VARIABLE
    set_var(data);
}

function print_info()
{
    return ajax_post_result;
}

function ajax_post(file, data )
{
    $.post( file, data, return_handler);

    //PRINTS UNDEFINED
    alert("RETURN:: " + print_info() );
}

</script>

<form id=newform name='testform'>
<input type="hidden" name="newexample" value="1">
Enter Something: <input name="something" id='something1' value="" type="text">
<input type="button" value="Submit" name="Submit" onclick="ajax_post('index.php?action=test', $('#newform').serialize() ); return false;">
</form>

2 个答案:

答案 0 :(得分:2)

您的问题是由于AJAX的异步性质。

您应该在回调函数中执行所有后期AJAX处理。像这样(使用你当前的功能)

$.post(file, data, function(data, textstatus) {
    return_handler(data, textstatus);
    alert("RETURN:: " + print_info());
});

虽然您可以轻松地将您的功能组合到一个闭包中(减去警报),例如

$.post(file, data, function(data, textstatus) {
    ajax_post_result = data;
});

答案 1 :(得分:2)

正如首字母缩略词中的第一个A 异步所证明的那样,AJAX请求是正确的。因此,当您调用$.post()时,ajax_post函数的执行会或多或少立即以其快乐的方式继续执行,而无需等待请求完成。在return_handler运行以设置全局变量之前,您将进入“返回”警报。

可以使用jQuery.ajax并将async选项设置为false,这样可以获得同步请求。

或者,我推荐这个策略,只有在请求成功处理程序完成后才会移动所有需要的东西。