Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Java脚本函数未从Ajax请求返回值_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript Java脚本函数未从Ajax请求返回值

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

我有以下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 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代码)

看看像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;})