【问题标题】:Ajax response to be a return value of a function [duplicate]Ajax响应成为函数的返回值[重复]
【发布时间】:2014-06-07 23:18:34
【问题描述】:

在下面的代码中,我没有在第二个警报中收到 locale

if `value==null`

我分配了它的locale 值。但最后不要得到它。

function getLocale(id) {
    var locale="";
    var value = localStorage.getItem(id);
    if (value == null) {
        $.ajax({
            type: "POST",
            url: "myUrl",
            data: {"new" : id},
            success : function(data) {
                data = JSON.parse(data)
                var id = data[0]["id"];
                delete data[0]["id"];
                localStorage.setItem(id, JSON.stringify(data[0]));
                locale=JSON.stringify(data[0]);
                alert(locale);//corrects value
            }// end success
        });
    }else{
        locale= localStorage.getItem(id);
    }
    alert(locale+"locale");//not have the value
    return locale;
}

【问题讨论】:

  • ajax 请求是一个异步进程,这意味着它与您的函数返回值的时间不同
  • @T.J.Crowder 是的,这是一个可能的重复,它只是由 OP 以不同的方式询问
  • @T.J.Crowder 我需要这个函数作为返回值
  • 这篇文章需要重命名Ajax response to be a return value of a function
  • @LOL:然后阅读该问题的答案。

标签: javascript jquery variables scope variable-assignment


【解决方案1】:

这不是因为范围。这是因为 ajax 调用的异步行为。因为函数不会等待ajax的成功事件。

如果你想返回,你应该在ajax中使用async:false。但这不是一种好的编码方法。

或者您应该使用异步 ajax 重构您的代码。不是返回值,而是在 ajax 成功中调用具有所需 id 的函数。

【讨论】:

  • 解决办法是什么
  • 反对者请发表评论。那么只有我可以改进我的答案
  • 嘿,这个答案根本不应该投反对票......他首先回答并且他建议正确..请不要不必要地投反对票
【解决方案2】:

ajax 请求是一个异步进程,这意味着它的执行时间与您的函数不同返回一个值。

这里的诀窍是不要假设在函数范围内有返回值在成功回调函数中完成所有流程

    success : function(data){
      //do everything what you want to do with the response here
    }

【讨论】:

  • 我需要这个函数不同的时间,所以我需要返回值
  • 如果你向自己推送一个ajax请求的返回值,你就做错了,因为ajax有不同的时间(除非你会这样做async:false,但这会导致你遇到更多问题) , 你能做的就是在回调中调用你需要处理的所有函数,否则你会以一种肮脏的方式来解决你的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2021-06-05
  • 2018-06-09
相关资源
最近更新 更多