从Javascript函数返回值

时间:2011-08-10 22:04:23

标签: php javascript xmlhttprequest

我使用以下代码显示函数test2的值返回值。

显示的输出为: x的值为:undefined

任何人都可以帮我解释如何从函数test2返回值?请注意,函数test2XMLHTTPRequest

<script language="javascript">

    function test1()
    {
        var x = test2();
        alert('Value of x is: '+x);
    }

    function test2()
    {
        if(window.XMLHttpRequest)
        {
            abcd= new XMLHttpRequest();
        }
        else
        {
            abcd=new ActiveXObject("Microsoft.XMLHTTP");
        }

        abcd.onreadystatechange=function()
        {
            if (abcd.readyState==4 && abcd.status==200)
            {
                    return abcd.responseText; // it is getting value 2 here
            }
            else if(abcd.readyState < 4)
            {
                return -1;
            }
        }
        abcd.open("GET",sam.php,true);
        abcd.send();
    }

</script>

5 个答案:

答案 0 :(得分:8)

听起来您希望XML HTTP请求中的值是test2的返回值。这是不可能的,因为此XML HTTP请求异步执行并且test2同步执行。

处理此问题的正确方法是将回调传递给test2以在请求完成时执行。向回调提供从XML HTTP请求返回的值。例如

function test1() {
  test2(function (x) {
    alert('The value of x is ' + x);
  });
}

function test2(callback) {
  ...
  abcd.onreadystatechange=function() {
    if (abcd.readyState==4 && abcd.status==200) {
      callback(abcd.responseText);
    } else {
      callback(-1);
    }
  }
  ...
}

答案 1 :(得分:3)

函数test2立即返回(值undefined)。在尝试从中获取任何数据之前,您需要等待AJAX​​调用返回。这是AJAX的(A)同步部分。

abcd.onreadystatechange=function()
{
    if (abcd.readyState==4 && abcd.status==200)
    {
        // Put the code that deals with the returned value here...
    }
    else if(abcd.readyState < 4)
    {
        return -1;
    }
}

答案 2 :(得分:1)

正如预期的那样,函数test1调用test2,它生成XMLHttpRequest。但问题在于你的时间安排。只有在状态发生变化时才会调用onreadystatechange。当状态改变时,函数test2已经退出而没有返回值。

相反,您的提醒应该发生在您目前return abcd.responseText的位置。

答案 3 :(得分:1)

函数test2除了你分配给onreadystatechange的回调之外没有返回任何内容。你应该从这个回调中调用test 1并将x的值传递给它,如下所示:

function test1(x)
{
    alert("X is: " + x);
}

function test2()
{
    // ...
    abcd.onreadystatechange=function()
    {
        var x = -1;
        if (abcd.readyState==4 && abcd.status==200)
        {
                x = abcd.responseText; // it is getting value 2 here
        }
        test1(x); // call test1 and pass in x
    }
    / ...
}

答案 4 :(得分:1)

你不能这样做,你的ajax请求是异步的。因此,当您执行test2()时,您没有获得任何价值。

请注意,定义onreadystate函数,它会从服务器获得各种响应,这就是为什么要验证readystate 4statuscode 200,您将进入该函数不同的时间。服务器完成后,如果一切正常,则返回这些代码。

你应该这样做:

<script language="javascript">

    function test1()
    {
        var x = test2();       
    }

    function test2()
    {
        if(window.XMLHttpRequest)
        {
            abcd= new XMLHttpRequest();
        }
        else
        {
            abcd=new ActiveXObject("Microsoft.XMLHTTP");
        }

        abcd.onreadystatechange= test2Result;
        abcd.open("GET",sam.php,true);
        abcd.send();
    }

    function test2Result()
    {
            if (abcd.readyState==4)
            {
                 if(abcd.status==200)
                 {
                    alert(abcd.responseText); // it is getting value 2 here
                 }
                 else 
                 {
                    alert('Something failed');
                 }
            } 

    }

</script>