0

我正在做噩梦试图做到这一点。到目前为止,我一定已经尝试了大约 15 种不同的方法,这些方法来自我读过的不同帖子,但都失败了。

我只是想从 ajax 帖子中获取返回值。这是我的代码

var test = compareNew(this.name, "remove");
alert(test);

function compareNew(obj, action) {
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
      success: function (result) {
      var myObject = eval("(" + result + ")");
      alert(myObject.html);
      return(result);
    }
  });
}

警报(myObject.html);正确地向我显示了返回的 html 但警报(测试);显示“未定义”。我已经花了几个小时在这上,但无法弄清楚。你能看到我错过了什么吗?

4

10 回答 10

2

实际上returnasynchronous调用中不起作用,但如果你设置async:false了它就会起作用,在这种(同步调用)情况下,你可以试试这个

function compareNew(obj, action) {
    $.ajax({
        url: "AJAX_compare_server.php",
        type: 'post',
        data: {
            compare_id:  obj,
            action:   action
        },
        success: function(result) { 
            returnresult(result); // will call the function and will alert
        }
    });
}

function returnresult(ret){
    // Do whatever you want to do with the result
    if(ret) alert(ret);
}
compareNew(this.name, "remove");

你也可以像这样使用它

function compareNew(obj, action, callBack) {
    $.ajax({
        //...
        success: function(result) { 
            callBack(result);
        }
    });
}

并称它为

compareNew(this.name, "remove", function(data){
    alert(data);
});
于 2012-10-16T19:32:12.850 回答
1

函数只会返回值。你应该使用 ajax 的 return out .....

于 2012-10-16T19:28:12.017 回答
0

将 async 设置为 false,然后在成功语句中设置返回值。在您的方法结束时(在您的 ajax 请求之外),返回 retVal。

function compareNew(obj, action) {
  var retVal;
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
    async: false,
    success: function (result) {
      var myObject = eval("(" + result + ")");
      retVal = myOBject.html;
      alert(myObject.html);
    }
  });
  return retVal;
}
于 2012-10-16T19:22:56.853 回答
0

Ajax 是异步的,因此alert(test);在 ajax 调用的结果完成之前执行。这就是你不确定的原因。

于 2012-10-16T19:20:22.877 回答
0

如果您有 Firefox 进行测试,您可以通过将警报转换为 console.log() 来了解异步调用的工作原理;并打开控制台。这将向您显示您正在转储的文本,并为您的 ajax 帖子提供可视化的表示(以及即将到来的数据)。您可以看到 test var 是如何立即执行的,顺便说一句,如果您希望 test 至少被定义,请尝试让 compareNew 返回“something”;在底部,好像 ajax 甚至不存在。

var test = compareNew(this.name, "remove");
console.log(test);

function compareNew(obj, action) {
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
      success: function (result) {
      var myObject = eval("(" + result + ")");
      console.log(myObject.html);
      //return(result); //this line isn't gonna do anything.
    }
   return "something";
  });
}

`

于 2012-10-16T19:29:56.587 回答
0

您无法从异步调用(如 AJAX 请求)中获取返回值。原因是等待响应的代码在收到响应时已经执行。解决方案是在success:回调中运行必要的代码。

function compareNew(obj, action) {
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
      success: function (result) {
        // Run the code here that needs
        //    to access the data returned
        return result;
    }
  });
}

或者你可以在success:回调中调用另一个函数

function compareNew(obj, action) {
      $.ajax({
        url: "AJAX_compare_server.php",
        type: 'post',
        data: {
          compare_id:  obj,
          action:   action
        },
          success: function (result) {
            callFuction(result)
            return result;
        }
      });
    }

你也可以让它同步。你需要async:false让它发生。

function compareNew(obj, action) {
var return_this;
$.ajax({
url: "AJAX_compare_server.php",
type: 'post',
async: false,
data: {
  compare_id:  obj,
  action:   action
},
success: function (result) {
            return_this = result;
    }
  });
return return_this;
}
于 2012-10-16T19:31:57.673 回答
0

ajax 调用是异步的。一旦启动,javascript 将继续执行并且您的函数退出。成功处理程序中的 return 语句是对该匿名函数的返回,而不是对 compareNew 函数的返回语句。undefined是我希望从您的脚本中得到的结果。

您可能应该做的是让成功函数调用您定义的另一个函数,并且该函数应该对从您的 ajax 调用返回的值执行工作。

如果您希望您的方法是同步的,您可以设置一个选项(可能是您已经尝试过的选项之一)。在您的成功处理程序中,将一个作用于您的函数的变量设置为您要返回的值,然后在 ajax 方法调用之后,返回该值。我建议不要这样做,因为使 ajax 调用同步会阻止任何其他 javascript 在调用等待返回时执行,这通常会导致用户体验不佳。

于 2012-10-16T19:17:24.577 回答
0

这里需要注意两点。

  1. 您的 ajax 调用是异步的,这意味着它完全有可能在alert(test)运行后返回。
  2. return (result)不是从compareNew. 它从success您创建的函数返回
于 2012-10-16T19:17:47.770 回答
0

不能从 Ajax 获得返回值..

它是异步的

于 2012-10-16T19:17:57.080 回答
0

你正在使用return作为一种方法

正确的是:

return result;
于 2012-10-16T19:18:01.883 回答