【问题标题】:How to Return ajax result in success? [duplicate]如何成功返回ajax结果? [复制]
【发布时间】:2017-04-01 11:00:41
【问题描述】:

即使这个问题已经得到解答,并且我已经解决了其中的一些问题,但我仍然找不到我做错了什么。

基本上我有一个返回ajax成功结果的函数:

var Functioncalling = function(id){
var Infotoreturn=null;
formdata = {
    'id': id
};

$.ajax({
    type: 'POST', 
    url: 'http://localhost:20012/pr/servlet', 
    data: formdata,
    contentType: "text/html",
    success: function(result){
       console.log("1="+result);
       Infotoreturn = result;
    }
});
console.log("2="+Infotoreturn);
return Infotoreturn;
}

调用函数:

var idreturned = Functioncalling(idvalue);
console.log("3="+idreturned);

现在,在我的第一个控制台输出中,我得到的数据完全符合我的设想。但是第二个和第三个输出都是空的。

【问题讨论】:

  • 不能返回异步请求的结果。异步请求发生在其余代码的(同步)流之外,因此当您尝试返回结果时,请求尚未解决。你需要了解 promises 或者 jQuery 中的延迟对象。
  • 除了@Utkanos 所说的内容之外,您最后的退货声明还为时过早。变量Infotoreturn 将为null,因为Ajax 调用是异步执行的,即并行执行。主函数将在其操作完成之前返回。控制台会记录结果,但对于变量来说为时已晚。
  • @Manngo 你的意思是早点换变量,对吧?
  • 没错。实际上,并且 Ajax 调用在后台延迟,因此 return 语句仍然具有原始值。您可以使用更高级的功能,例如 Promises 和延迟对象,也可以将下一步编写为回调。我将在答案中说明后者。
  • 使用异步编程,您需要改变对代码的看法。阅读并理解这个:stackoverflow.com/questions/17808651/return-function-javascript/… 和这个:stackoverflow.com/questions/17460556/…

标签: javascript jquery ajax


【解决方案1】:

除了@Utkanos 所说的,你最后的 return 声明还为时过早。

变量Infotoreturn 将为null,因为Ajax 调用是异步执行的,即并行执行。主函数将在其操作完成之前返回。控制台会记录结果,但对于变量来说为时已晚。

有效,而且Ajax调用在后台延迟,所以return语句还是原来的值。

您可以使用更高级的功能,例如 Promise 和延迟对象,也可以将下一步编写为回调。

这里是一个使用回调的例子:

var Functioncalling = function(id,callback) {
    var Infotoreturn=null;
    formdata = {
        'id': id
    };

    $.ajax({
        //  existing code
        success: function(result){
           console.log("1="+result);
            //  Modification
           callback(result);
        }
    });
    //  nothing to report yet
}
function where_I_need_the_result(result) {
    console.log('I got: '+result);
}

Functioncalling(id,where_I_need_the_result);

【讨论】:

  • 抱歉我的回复晚了。无论如何,所以我在step2() 中添加了return result 并且我这样做了:function where_I_need_the_result(){var details = Functioncalling(id,step2); console.log(details);} 并且细节未定义,为什么?
  • 你永远不会从Functioncalling 得到结果,除非你让它等待结果。也就是使Ajax 调用同步进行。出于充分的理由,这在主线程上已被弃用。在上面的示例中,我将step2 更改为where_I_need_the_result 以说明如何使用它。
  • @jaksdfjl:仔细阅读答案。您错过了一个非常重要的点传递您想要处理结果而不是返回结果的代码。你不能做details = Functioncalling(id),你必须Functioncalling(id,function(details) {/*details are available in this scope*/})
猜你喜欢
  • 2011-11-18
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多