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

Javascript - return a value from a function called elsewhere

本文关键字:返回 函数 一个 调用 其他 方调用 Javascript-      更新时间:2023-09-26

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

我正在制作一个使用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(。有办法做到这一点吗?

我意识到这可能是不可能的,但我能做些什么来达到同样的效果吗。

您推出自己的Ajax助手有什么原因吗?

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

显然,您可以使用类似jQuery.ajax的东西,但对于如此简单的东西来说,这可能有些过头了。

您可以在http://microjs.com/#ajax实现你追求的目标。

您将无法这样做,因为请求不会阻塞(它是异步的)。您要做的是使用回调,就像将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(),但我认为这样更干净。

这里似乎有几个问题:

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');
};

你试过吗

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