我還在讀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調用了匿名函數,在匿名函數裡返回的值我要怎麼在外層函數獲取?或者有其他什麼方法能達到我的目的?我也試過在外層函數定義變量,在匿名函數裡為變量賦值,但由於匿名函數綁定了事件,所以這樣做直接返回空值。
自己想了很久,也百度過了,實在想不出解決辦法,還請各位不吝賜教。
你要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)})//