日期:2014-05-16  浏览次数:20525 次

写了一个带有ajax的javascript函数返回值出现了问题
function tra(tracename, Listname) {
  var comments="";
  $.post("../Ctrl/GetComments.ashx", { "tracename": tracename, "Listname": Listname, "CatId": "" }, function(data, status) {

  if (status != "success") {
  $("#" + lblAdmin).append($("<li>加载失败!</li>"));
  return;
  }
  else {

  var lines = data.split("$");

  for (var i = 0; i < lines.length; i++) {

  var line = lines[i];
  var fields = line.split("|");
  var comment = $("<li><button id=" + fields[0] + ">删除</button><a href=UI.aspx?action=UPDATE&Listname=" + Listname + "&Itemid=" + fields[0] + ">" + fields[1] + "发帖日期:" + fields[2] + "</a></li>");
  $("a[id=" + fields[0] + "]").attr({ "href": fields[0], "target": "_self" });

  comments += comment.html();
  }
  return comments;
  }
  alert(comments);
  });
  }
  $(function() { alert(tra("ESite", "T_News")); });
  $("#T_News").html(tra("ESite", "T_News"))
  alert(tra("ESite", "T_News"));
最上面的tra函数可以运行,运行之后可以alert出comment里的内容,但是就是不能return出comments
在最后的alert(tra("ESite", "T_News"))的结果是undefind紧上面的也没有好结果。


------解决方案--------------------
多次看到这种问题
建议了解一下什么是异步执行,及回调函数的意义,不然你连代码有没有执行都不知道

你的想法是无法实现的,不然jquery就可以给你提供一个函数,让你传入参数,给你返回ajax获取的值了,哪里还要你来写?

jqury为什么不提供这样的函数?其他框架也是这样,难道你认为写框架的大牛们疏忽了么?
这是无法实现的,ajax异步执行,无法预料返回的时间,所以不可能把主线程阻塞在这等待返回值(甚至可能通讯失败,一直等待直至超时),于是又了回调机制,主线程可以继续执行,页面也就不会死这儿

你这儿的正确写法应该是:

function tra(tracename, Listname,callback) {//传递一个函数,用以在ajax回调函数中获得值
var comments="";
$.post("../Ctrl/GetComments.ashx", { "tracename": tracename, "Listname": Listname, "CatId": "" }, function(data, status) {

if (status != "success") {
$("#" + lblAdmin).append($("<li>加载失败!</li>"));
return;
}
else {

var lines = data.split("$");

for (var i = 0; i < lines.length; i++) {

var line = lines[i];
var fields = line.split("|");
var comment = $("<li><button id=" + fields[0] + ">删除</button><a href=UI.aspx?action=UPDATE&Listname=" + Listname + "&Itemid=" + fields[0] + ">" + fields[1] + "发帖日期:" + fields[2] + "</a></li>");
$("a[id=" + fields[0] + "]").attr({ "href": fields[0], "target": "_self" });

comments += comment.html();
}
//return comments;//这儿被返回的函数是ajax的回调函数而不是你的函数,搞清楚
callback(comments);//把需要的值传递到回调函数
}
alert(comments);
});
}
$(function() { tra("ESite", "T_News",
function(comments){alert(comments);})//在该函数中就可以使用获取的值
});
tra("ESite", "T_News",function(comments){$("#T_News").html(comments)})