2012-02-22 67 views
2

这个问题的标题不是很清楚,但我无法解释我在问什么而没有提供一些代码。Javascript - 从其他地方调用的函数返回值

我正在制作一个使用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()可以决定做什么 - 可能在不同的页面上有所不同。有没有办法做到这一点?

我意识到这可能是我尝试的方式不可能的,但是在那里我可以做同样的效果。

回答

1

你有什么理由让自己的Ajax帮手?

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

显然,你可以使用类似jQuery.ajax的东西,但这可能是矫枉过正的一件事情,这很简单。

你可以试试http://microjs.com/#ajax上的许多微型Ajax库中的一个来实现你的目标。

+0

我没有发现这个。我使用匿名函数传递给使用jQuery的函数,这些函数在成功或失败时被调用。 – 2012-02-22 17:47:18

0

你试过

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

你试过了吗? (这不起作用) – jprofitt 2012-02-22 17:24:40

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(),但我认为这种方式更清洁。

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'); 
}; 
相关问题