Javascript - 从其他地方调用的函数返回一个值

时间:2012-02-22 17:14:45

标签: php javascript ajax function

这个问题的标题不是很清楚,但如果不提供一些代码,我无法解释我的要求。

我正在制作一个使用AJAX提交报告(即数组)的页面。我将函数存储在一个库中,该库将数组提交到PHP页面,如下所示:

function saveReport(params)
{
    var url="reports/save.php";

        xmlHttp=GetXmlHttpObject();
        if (xmlHttp==null)
        {
            return false;
        }
        xmlHttp.onreadystatechange=stateChanged;
        xmlHttp.open("POST",url,true);
        //Send the proper header information along with the request
        xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlHttp.setRequestHeader("Content-length", params.length);
        xmlHttp.setRequestHeader("Connection", "close");
        xmlHttp.send(params);

}

function stateChanged() 
{ 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    { 
        if (xmlHttp.responseText == 'complete')
        {
            return true;
        }
        else
        {
            return false;
        }
    } 
}

(我不相信GetXmlHttpObject()函数与问题相关)

我希望能够像我这样从我的页面调用saveReport()

success = saveReport(params);
if (success == true)
{
    alert('success');
}
else
{
    alert('failure');
}

因此函数saveReport()需要返回一个值,该值在调用时从函数stateChanged()返回,以便调用saveReport()的页面可以决定做什么 - 在不同的情况下可能会有所不同页面。有没有办法做到这一点?

我意识到我尝试的方式可能是不可能的,但我能做些什么来达到同样的效果。

4 个答案:

答案 0 :(得分:1)

你有没有理由推出自己的Ajax助手?

在这种情况下,您需要在服务器响应时触发回调函数,以便您可以对响应执行某些操作,无论是成功还是失败。

显然,你可以使用jQuery.ajax这样的东西,但这对于这么简单的事情来说可能有些过分。

您可以在http://microjs.com/#ajax尝试众多微型Ajax库中的一个,以实现您的目标。

答案 1 :(得分:1)

您将无法这样做,因为请求不会阻止(它是异步的)。您要做的就是使用回调方式,就像将stateChanged()设置为xmlHttp.onreadystatechange的回调函数一样。

您可以创建一个处理结果的新函数,并从stateChanged()调用该函数,并将truefalse作为参数来表示成功。

function stateChanged() 
{ 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    { 
        saveReportFinished(xmlHttp.responseText == 'complete');
    }
    else{
        saveReportFinished(false); 
    }
}

function saveReportFinished(success) {
    if (success == true)
    {
        alert('success');
    }
    else
    {
        alert('failure');
    }
}

从技术上讲,你可以将所有这些结合到stateChanged()中,但我认为这样更干净。

答案 2 :(得分:1)

看起来你有几个问题:

1)异步操作会导致函数返回出现问题,因为该函数将在异步响应返回之前完成触发。 2)函数只会返回你告诉它的内容,所以要获得一个函数来返回另一个函数的结果,你需要做这样的事情:return stateChanged( args )

1)的解决方案是使用回调,如下所示:

function saveReport( params, callback ){
...
xmlHttp.onreadystatechange = function(){
    stateChanged( callback );
};

在stateChanged()...

中运行回调
function stateChanged( callback ){
...
callback( true );
...
callback( false );

然后像这样传递回调:

saveReport( params, function( boolean ){
    if( boolean )
        alert('success');
    else
        alert('failure');
};

答案 3 :(得分:0)

你试过吗

success = saveReport(stateChanged());
if (success == true) {
    alert('success');
} else {
    alert('failure');
}