Javascript Java脚本函数未从Ajax请求返回值
我有以下AJax请求函数,它运行良好。成功后返回1或2 现在我想根据这个返回值在这个函数之外执行一些操作,如下所示,但它不起作用。。它总是返回“未定义的” 我希望Javascript Java脚本函数未从Ajax请求返回值,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有以下AJax请求函数,它运行良好。成功后返回1或2 现在我想根据这个返回值在这个函数之外执行一些操作,如下所示,但它不起作用。。它总是返回“未定义的” 我希望return\u code应该根据以下代码返回1或2 <script> var return_code=add_to_cart_ajax(200); alert(return_code); </script> returns "undefined" var return\u code=add\u to\u
return\u code
应该根据以下代码返回1或2
<script>
var return_code=add_to_cart_ajax(200);
alert(return_code);
</script>
returns "undefined"
var return\u code=add\u to\u cart\u ajax(200);
警报(返回_代码);
返回“未定义”
AJAX请求:
<script>
//Ajax to send request to add
function add_to_cart_ajax(id)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
alert(xmlhttp.responseText); // returns 1
if (xmlhttp.responseText==1)
{
return 1;
}
else
{
return 2;
}
}
}
xmlhttp.open("GET","add.php?id="+id,true);
xmlhttp.send();
}//end of the function..
</script>
ajaxReturn = null;
function add_to_cart_ajax(id) {
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
ajaxReturn = xmlhttp.responseText;
}
}
xmlhttp.open("GET","add.php?id="+id,true);
xmlhttp.send();
while(ajaxReturn == null) {
//waiting for response
//will break if the request is finished
}
alert(ajaxReturn);
}//end of the function..
//Ajax发送添加请求
函数add\u to\u cart\u ajax(id)
{
if(window.XMLHttpRequest)
{//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}
其他的
{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
xmlhttp.onreadystatechange=函数()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
警报(xmlhttp.responseText);//返回1
if(xmlhttp.responseText==1)
{
返回1;
}
其他的
{
返回2;
}
}
}
open(“GET”、“add.php?id=“+id,true”);
xmlhttp.send();
}//函数结束。。
由于AJAX调用是异步的,因此处理它的一种常见方法是使用回调函数,该函数在处理请求后会被调用
差不多
<script>
add_to_cart_ajax(200, function(return_code) {
alert(return_code);
});
</script>
<script>
//Ajax to send request to add
function add_to_cart_ajax(id, callback) {
...
alert(xmlhttp.responseText); // returns 1
if (xmlhttp.responseText==1) {
callback(1);
} else {
callback(2);
}
...
}//end of the function..
</script>
将\添加到\购物车\ ajax(200,函数(返回\代码){
警报(返回_代码);
});
//Ajax发送添加请求
函数add\u to\u cart\u ajax(id,回调){
...
警报(xmlhttp.responseText);//返回1
if(xmlhttp.responseText==1){
回调(1);
}否则{
回调(2);
}
...
}//函数结束。。
编辑:如果您需要保留返回代码,您可以这样做
<script>
var return_code;
add_to_cart_ajax(200, function(result) {
return_code = result;
});
</script>
var返回u码;
将\u添加到\u购物车\u ajax(200,函数(结果){
返回\ U代码=结果;
});
但必须了解的是,由于AJAX请求是异步的,因此在AJAX请求完成之前,
return\u code
变量不会为其分配值,并且在发生任何情况之前,您不能使用它,因此,任何需要处理return\u code
的代码都应该包含在回调中或从回调中调用。如果您来自一个所有代码都是自上而下运行的背景,那么这一点一开始会有点难以理解。一旦你开始使用异步的东西,情况就不是这样了。看到ajax调用是异步的,你就不能期望结果出现在你的警报中(返回\u代码)因为当时ajax调用还没有得到响应
看看像jQuery或Zepto这样的库是如何实现的,以及如何实现以下“承诺”逻辑,以避免回调地狱,可能会很有用。好的,我将尝试举一个例子:
如果您在amazon上订购了一个软件包,并且希望在下一步将其解包
orderPackage();
unpackPackage(); // undefined / exception, because you have to wait for the package to be arrived
尽量不要返回带有“onreadystatechange”的值。您可以从该方法内部调用另一个函数,也可以设置全局变量。例如:
仅解释ajax是如何工作的(不要使用这种代码和平,向下滚动以获得更好的解决方案!):
<script>
//Ajax to send request to add
function add_to_cart_ajax(id)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
alert(xmlhttp.responseText); // returns 1
if (xmlhttp.responseText==1)
{
return 1;
}
else
{
return 2;
}
}
}
xmlhttp.open("GET","add.php?id="+id,true);
xmlhttp.send();
}//end of the function..
</script>
ajaxReturn = null;
function add_to_cart_ajax(id) {
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
ajaxReturn = xmlhttp.responseText;
}
}
xmlhttp.open("GET","add.php?id="+id,true);
xmlhttp.send();
while(ajaxReturn == null) {
//waiting for response
//will break if the request is finished
}
alert(ajaxReturn);
}//end of the function..
请不要在有效率的情况下使用此功能,因为while会导致浏览器停止运行。
但这应该可以向你解释这种行为
正确的解决方案
// This will send an ajax-request and execute the fCallback if finished
// @param sUrl - Url to send the request to
// @param fCallbackSuccess - method that will be executed on successfull request
// @param fCallbackFailed - method that will be executed on failed request
// @param bAsync - will make the request async or sync
function ajax(sUrl, fCallbackSuccess, fCallbackFailed, bAsync) {
if (window.XMLHttpRequest) {
oXmlHttp=new XMLHttpRequest();
} else {
oXmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
oXmlHttp.onreadystatechange=function() {
if (oXmlHttp.readyState==4 && oXmlHttp.status==200) {
fCallbackSuccess.apply(oXmlHttp);
return;
}
fCallbackFailed.apply(oXmlHttp);
}
oXmlHttp.open("GET", sUrl, bAsync);
oXmlHttp.send();
}
//usage example:
var fSuccess = function(oXmlHttp) {
//do something with oXmlHttp
alert(oXmlHttp.responseText);
}
var fFailed= function(oXmlHttp) {
//do something with oXmlHttp
alert('Request failed!');
}
ajax("add.php?id="+id, fSuccess, fFailed, true);
祝你度过愉快的一天将返回更改为alter(1)/alert(2)@ManuelRicharz:我已经说过,alert(xmlhttp.responseText);//返回1great。ajax是一项asycn任务。如果您编写脚本代码并期望此方法返回值,则它将不起作用。@ManuelRicharz:因此,请告诉我一些替代解决方案nReadyStateChange是一个事件。您必须等待此事件获得Fireddown投票吗?真希望我能忍受。。。但也请为其他人解释一下。请使用注释框。谢谢你仔细阅读我的帖子。。。。。你会看到。主要问题中的问题不是返回1或2。问题在于对异步ajax的理解。这就是我想在我的帖子中解释的。是的,当然回调是更好的解决方案。但在第一步,他必须了解它是如何工作的。好吧,让我做一些改变。我没有看到任何反对票!你说的oXmlHttp是什么意思?oXmlHttp和xmlHttp之间有什么区别?我已经很久没有使用JQuery了,他们是否最终开始为$使用承诺。ajax
?我几乎不使用它,但它们实现了承诺/延迟逻辑行为。回调(1)是什么意思?没有为回调函数定义函数函数add\u to\u cart\u ajax(id,callback)
指示add\u to\u cart\u ajax
函数采用的参数为回调
。然后在请求完成后调用该函数。如果您查看顶部的代码块,您将看到这是在id
为200之后传入的。您可以在此处阅读有关回调的更多信息:一旦您掌握了回调的好方法,我还建议查看承诺
,这通常是处理异步代码的更干净的方法。我可以这样做吗?我需要存储返回代码var return_code=add_to_cart_ajax(200,函数(return_code){return 1;})代码>