JS结合Ajax获取function的返回值,求教!!!!

happyxiaowuge007 2012-03-15 11:53:50
用到Ajax的function代码如下:
此function的作用是根据传过来的类别ID,返回它下面的直属子类别信息。想返回的值就是resultStr
function GetChildClassStr(classID){
createXMLHttpRequest();
ajax.open("POST", "../Ajax/showClassList.ashx", true);
ajax.onreadystatechange = function() {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
var resultStr = ajax.responseText;
return resultStr;
}
else {
alert(ajax.status);
}
}
}
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.send("type=child&id=" + classID);
}

以下是另外一个调用GetChildClassStr方法的function,代码如下:
function AddChildNode(classID){
var childClassStr=GetChildClassStr(classID);// 字符串格式"||1000-五金用品||1001-电脑设备"
var childClasses=childClassStr.split("||");
......
}

现在的问题是,每次在function AddChildNode里获取到的childClassStr值为undifined。
经过调试脚本后发现,function GetChildClassStr在每次执行到ajax.readyState == 4的时候会跳出方法,去执行下面的语句,然后不知道是什么时候又会执行到ajax.status == 200的if条件里面去,然后得到的resultStr 值是正确的。但是在它跳出方法执行下面的语句的时候已经报错了,因为function AddChildNode的 childClassStr还没有得到值,然后去做split,报错了。
此问题要如何解决呢?
...全文
3950 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
匿名旅途 2014-06-16
  • 打赏
  • 举报
回复
引用 11 楼 tygg_ylpp 的回复:
引用
[code=css]
[/code]
tygg_ylpp 2013-03-29
  • 打赏
  • 举报
回复
引用
[code=css]
[/code]
色拉油 2012-03-16
  • 打赏
  • 举报
回复
不要异步
happyxiaowuge007 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 likeajin 的回复:]
下面是我自己封装的ajax和部分代码,希望能帮到你

JScript code



Object.prototype.copy=function(extendObj){
if(!App.isObject(this))throw {message:'对象不支持此属性或方法'};
if(App.isObject(extendObj))for(var p in ext……
[/Quote]

道行淺了看不懂....
happyxiaowuge007 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yueshangchuanqi 的回复:]
在GetChildClassStr这个涵数中定义一个局部变量
我大概写一个伪代码
function GetChildClassStr()
{
var s="";
ajax.onreadystatechange = function() {
//在这里把返回值赋给s,即是把return resultStr;改为s=resultStr;
}

//在ajax请求完成的后的外面。将re……
[/Quote]


這個試了一下,貌似不行,首先得到的不是裡邊的值,是定義S變量時賦的值""。
happyxiaowuge007 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 thedolphin 的回复:]
不要异步
[/Quote]

如何做到?
likeajin 2012-03-15
  • 打赏
  • 举报
回复
下面是我自己封装的ajax和部分代码,希望能帮到你


Object.prototype.copy=function(extendObj){
if(!App.isObject(this))throw {message:'对象不支持此属性或方法'};
if(App.isObject(extendObj))for(var p in extendObj)this[p]=extendObj[p];
}
Object.prototype.copyIf=function(extendObj){
if(!App.isObject(this))throw {message:'对象不支持此属性或方法'};
if(App.isObject(extendObj))for(var p in extendObj)if(App.isUndefined(this[p]))this[p]=extendObj[p];
}
String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,'')};

var App={
_getType:function(v){return Object.prototype.toString.apply(v)},
getType:function(v){if(v===undefined)return '[object Undefined]';else if(v===null)return '[object Null]';return App._getType(v)},
isFunction:function(v){return App._getType(v)==='[object Function]'},
isObject:function(v){return App._getType(v)==='[object Object]'},
isArray:function(v){return App._getType(v)==='[object Array]'},
isDate:function(v){return App._getType(v)==='[object Date]'},
isString:function(v){return App._getType(v)==='[object String]'},
isBoolean:function(v){return App._getType(v)==='[object Boolean]'},
isNumber:function(v){return App._getType(v)==='[object Number]'},
isInt:function(v){return App.isNumber(v) && (v+'').indexOf('.')<0},
isUndefined:function(v){return v===undefined},
isNull:function(v){return v===null},
isBlankString:function(v){return App.isString(v) && v.trim().length==0},
isNotBlankString:function(v){return App.isString(v) && v.trim().length>0},
isEmptyObject:function(v){return App.isObject(v) && (function(x){for(var p in x)return false;return true}(v))},
isNotEmptyObject:function(v){return App.isObject(v) && (function(x){for(var p in x)return true;return false}(v))}
};

var AJAX={};
AJAX.copy({
/**
* 建立一个ajax对象
*/
createAjax:function(){
var xmlHttpRequestObj;
try{
xmlHttpRequestObj=new XMLHttpRequest();
}
catch(e){
try{
xmlHttpRequestObj=new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e){
try{
xmlHttpRequestObj=new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e){
return false;
}
}
}
return xmlHttpRequestObj;
},
/**
* 一个ajax的请求操作
* @param url
* ajax访问的地址
* @param params
* 传递的参数
* @param callback
* ajax访问后的回调函数
* @param submitMode
* 提交的方式,默认为post
* @param async
* 执行ajax的模式,异步或同步,默认为异步,设置async===false表示为同步
*/
request:function(url,params,callback,submitMode,async){
var ajax=this.createAjax();
if(!ajax)return;
ajax.onreadystatechange=function()//ajax的关键函数,每当发送请求时ajax的状态一改变就执行
{
if (ajax.readyState==4 && ajax.status==200)//4表示ajax请求完成,200表示请求得到执行
{
if(App.isFunction(callback)){callback(ajax.responseText)}
}
}
/**
* 打开请求,第一个参数为请求的方式,包括post和get两种,常用post;
* 第二个参数为请求的url,前面定义的那个;
* 第三个参数为ajax是同步调用还是异步调用,同步调用表示本次请求完成后才执行请求后的代码,否则边请求边执行页面的其他程序,ture表示异步
*/
if(submitMode==='GET' && App.isNotBlankString(params))url+='?'+params;
ajax.open(submitMode||'POST',url,async!==false);
//发送请求,参数为字符串,当请求方式为post时有效
if(submitMode==='GET')ajax.send();
else{
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
ajax.send(params);
}
return ajax;
},
/**
* 中断一个ajax
*/
abort:function(ajax){ajax.abort()}
});

使用示例:主要是AJAX.request方法

var request=AJAX.request('xxx.jsp|asp|aspx|php','',function(result){alert(result)});
//AJAX.abort(request);
小昭 2012-03-15
  • 打赏
  • 举报
回复
在GetChildClassStr这个涵数中定义一个局部变量
我大概写一个伪代码
function GetChildClassStr()
{
var s="";
ajax.onreadystatechange = function() {
//在这里把返回值赋给s,即是把return resultStr;改为s=resultStr;
}

//在ajax请求完成的后的外面。将resultStr返回;即GetChildClassStr()这个涵数的最后一行代码是
return s;
}

这样你在其他涵数调用GetChildClassStr()就能取到返回值了
happyxiaowuge007 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 woshizou 的回复:]
这是异步的。没法控制数据的先后。楼主要换种思路实现。何不把逻辑写在后台呢?
[/Quote]
[Quote=引用 2 楼 likeajin 的回复:]
要么在ajax的onreadystatechange事件函数中处理你的逻辑,要么把ajax改为同步。
[/Quote]
[Quote=引用 3 楼 acesidonu 的回复:]
要不选择同步,要不在回调函数里面执行后面需要的操作。
[/Quote]

恩,我换种思路吧。
只是还有疑问,异步就没法控制先后吗,还有又如何选择同步呢?
Acesidonu 2012-03-15
  • 打赏
  • 举报
回复
要不选择同步,要不在回调函数里面执行后面需要的操作。
likeajin 2012-03-15
  • 打赏
  • 举报
回复
要么在ajax的onreadystatechange事件函数中处理你的逻辑,要么把ajax改为同步。
喜阳阳 2012-03-15
  • 打赏
  • 举报
回复
这是异步的。没法控制数据的先后。楼主要换种思路实现。何不把逻辑写在后台呢?

87,921

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧