这个问题的标题不是很清楚,但如果不提供一些代码,我无法解释我的要求。
我正在制作一个使用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()的页面可以决定做什么 - 在不同的情况下可能会有所不同页面。有没有办法做到这一点?
我意识到我尝试的方式可能是不可能的,但我能做些什么来达到同样的效果。
答案 0 :(得分:1)
你有没有理由推出自己的Ajax助手?
在这种情况下,您需要在服务器响应时触发回调函数,以便您可以对响应执行某些操作,无论是成功还是失败。
显然,你可以使用jQuery.ajax这样的东西,但这对于这么简单的事情来说可能有些过分。
您可以在http://microjs.com/#ajax尝试众多微型Ajax库中的一个,以实现您的目标。
答案 1 :(得分:1)
您将无法这样做,因为请求不会阻止(它是异步的)。您要做的就是使用回调方式,就像将stateChanged()
设置为xmlHttp.onreadystatechange
的回调函数一样。
您可以创建一个处理结果的新函数,并从stateChanged()
调用该函数,并将true
或false
作为参数来表示成功。
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');
}