【问题标题】:Javascript global variable not being set from ajax call [duplicate]未从ajax调用设置Javascript全局变量[重复]
【发布时间】:2012-09-03 14:32:06
【问题描述】:

可能重复:
Return Value from inside of $.ajax() function

我正在开发一个使用广泛的 AJAX 调用控制器的 CakePHP 应用程序。我遇到了一个特定的 AJAX 调用,我试图将来自控制器的响应分配给一个 JS 全局变量。这是代码:

window.errors = "";

function setErrors(err) {
    window.errors = err;
}

function ajaxCall(u, t, d, dt) {
    var type = typeof t !== 'undefined' ? t : "post";
    var dataType = typeof dt !== 'undefined' ? dt : "json";
    var success = false;
    var err = "";
    $.ajax({url: url, data: "data=" + d, type: type, dataType: dataType,
        success: function(d){
                if(d.hasOwnProperty('success') === false) { //json response
                    for(var i in d) { //fetch validation errors from object
                        for(var j in i) {
                            if(typeof d[i][j] === "undefined") {
                                continue;
                            }
                            err += d[i][j] + "<br/>";
                        }
                    }
                    console.log(err); //<=== displays correct value
                    setErrors(err); //<=== but somehow this seems to be failing??
                }
                else {
                   if(d.success === "1") {
                       success = true;
                }
            }
        }
    });
    return success; //<=== I suspect this might be the culprit
}

这就是 ajaxCall() 的使用方式:

function register() {
    var data = {};
    var $inputs = $("#regForm :input");
    $inputs.each(function(){
        data[this.name] = $(this).val();
    });
    data = {"User" : data }; //CakePHP compatible object
    data = JSON.stringify(data);

    //Here's the AJAX call
    if(ajaxCall('https://localhost/users/add', 'post', data, 'json')) {
        alert("Registered!");
    }
    else {
        alert(window.errors); // <=== empty string
        console.log("window.errors is: " + window.errors); // <=== empty string
    }
}

但在 Chrome JS 控制台上,window.errors 返回正确的值(非空,验证错误字符串)。

我发现了一个similar question,它可能正在解决我的问题(紧跟在$.ajax() 之后的return successsuccess: 回调之前执行)。如何在不大幅更改代码的情况下解决此问题(另外,我不想将其设为同步调用)?

【问题讨论】:

    标签: javascript jquery global-variables


    【解决方案1】:

    是的,return 语句在成功回调之前运行是对的。你不能从函数返回结果,因为函数必须在成功事件被处理之前返回。

    ajaxCall 函数添加回调,并调用它而不是设置成功变量:

    function ajaxCall(u, t, d, dt, callback) {
      var type = typeof t !== 'undefined' ? t : "post";
      var dataType = typeof dt !== 'undefined' ? dt : "json";
      $.ajax({url: url, data: "data=" + d, type: type, dataType: dataType,
        success: function(d){
          if(d.hasOwnProperty('success') === false) { //json response
            for(var i in d) { //fetch validation errors from object
              for(var j in i) {
                if(typeof d[i][j] === "undefined") {
                  continue;
                }
                err += d[i][j] + "<br/>";
              }
            }
            callback(false, err);
          } else {
            callback(d.success === "1", "");
          }
        }
      });
    }
    

    将处理结果的代码发送到ajaxCall函数:

    ajaxCall('https://localhost/users/add', 'post', data, 'json', function(success, err){
      if (success) {
        alert("Registered!");
      } else {
        alert(err);
      }
    });
    

    【讨论】:

    • 感谢您的快速回复!是的,您的解决方案非常有效。我使用它的越多,我就会学习很多新的 JS 东西(以及它的许多怪癖)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2014-06-29
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多