关于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个回答

你要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)})//

Accenzer
Accenzer 非常感谢您的用心解答~正中要害,完美解决了我的问题!感谢感谢!
3 年多之前 回复
 function test(){
        var result = function (){
            return "value";
        }
        alert(result());//value
    }
    window.onload = test;
Accenzer
Accenzer 回复极简: 好的,谢谢。我去学习一下回调函数。
3 年多之前 回复
guwei4037
极简吧 回复Accenzer: 事件就只能在回调函数里面处理啦。
3 年多之前 回复
Accenzer
Accenzer 谢谢回答,将匿名函数赋予变量然后返回这个变量。但是我的这个函数里匿名函数绑定了一个事件 httpRequest.onreadystatechange,这样的话要怎么办呢?
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问