Accenzer 2017-01-02 03:30 采纳率: 66.7%
浏览 3475
已采纳

关于js匿名函数的返回值的获取问题

我还在读js的基础书籍,所以对一些js原理了解不是全面,所以问题如有愚昧,还请见谅。

 function asynSubmit(sData,action,method="POST"){
    var httpRequest = new XMLHttpRequest();
    var rMessage="请求未发送";
    httpRequest.open(method,action);
    httpRequest.setRequestHeader("content-type","application/x-www-form-urlencoded");
    httpRequest.send(sData);
    httpRequest.onreadystatechange=function(){
        if(httpRequest.readyState===4){
            console.log("4");
            if(httpRequest.status===200){
                console.log("200");
                var rData=httpRequest.responseText;
                //JSON.parse(httpRequest.responseText);
                return rData;
            }else{
                return "服务器异常";
            }
        }else{
            return "服务器未响应";
        }
    }
}

如上述代码,我想封装一个ajax的函数。想让函数返回responseText的值,因为onredeaychang调用了匿名函数,在匿名函数里返回的值我要怎么在外层函数获取?或者有其他什么方法能达到我的目的?我也试过在外层函数定义变量,在匿名函数里为变量赋值,但由于匿名函数绑定了事件,所以这样做直接返回空值。

自己想了很久,也百度过了,实在想不出解决办法,还请各位不吝赐教。

  • 写回答

2条回答 默认 最新

  • 斯洛文尼亚旅游 2017-01-02 05:13
    关注

    你要reutrn也要在asynSubmit最后,在匿名函数里面return是匿名函数的返回值,并不是asynSubmit的。而且你设计到ajax,只有改为同步asynSubmit return才能获取到值,异步的只能通过回掉形式来获取值

    同步

      function asynSubmit(sData,action,method="POST"){
     var rst=false;/////////////
    
        var httpRequest = new XMLHttpRequest();
        var rMessage="请求未发送";
        httpRequest.open(method,action,false);//////////////改同步
        httpRequest.setRequestHeader("content-type","application/x-www-form-urlencoded");
        httpRequest.send(sData);
        httpRequest.onreadystatechange=function(){
            if(httpRequest.readyState===4){
                console.log("4");
                if(httpRequest.status===200){
                    console.log("200");
                    var rData=httpRequest.responseText;
                    //JSON.parse(httpRequest.responseText);
                    rst= rData;////////////////////////////////////
                }else{
                    rst= "服务器异常";////////////////////////////////////
                }
            }else{
                rst= "服务器未响应";////////////////////////////////////
            }
        }
            return rst////////////////////////////////////
    }
    var data=asynSubmit('xxx','xxxx','xxxxx')//
    alert(data)
    

    异步,只能回掉,无法return

    
     function asynSubmit(sData,action,method="POST",callback){
        var httpRequest = new XMLHttpRequest();
        var rMessage="请求未发送";
        httpRequest.open(method,action);
        httpRequest.setRequestHeader("content-type","application/x-www-form-urlencoded");
        httpRequest.send(sData);
        httpRequest.onreadystatechange=function(){
            if(httpRequest.readyState===4){
                console.log("4");
                if(httpRequest.status===200){
                    console.log("200");
                    var rData=httpRequest.responseText;
                    //JSON.parse(httpRequest.responseText);
                   callback( rData);////////////////////
                }else{
                    callback( "
    

    服务器异常");////////////////////
    }
    }else{
    callback( "服务器未响应");////////////////////
    }
    }
    }

    asynSubmit('xxx','xxxx','xxxxx',function(data){alert(data)})//

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 关于#目标检测#的问题:(qq收集表到时间才能填写,填写的份数有上限)
  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 钢岔管添加弹性约束模拟围岩作用
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题