【问题标题】:Javascript - Returned item after AJAX is always undefinedJavascript - AJAX 后返回的项目始终未定义
【发布时间】:2017-09-17 19:38:54
【问题描述】:

我有这个功能:

function get_non_authorized_bulk_edit_option_values() {
        var modificable_column_names = get_write_user_values();
        alert(modificable_column_names);
}

调用的是这个(我没有粘贴所有细节,例如xml变量内容或OnError函数):

function get_write_user_values() {
    var request = $.ajax({
                            type: "POST",
                            async: false,
                            url: "model/_get_user_groups_info_pipe.php",
                            data: xml,
                            contentType: "text/xml; charset=utf-8",
                            dataType: "json",
                            success: OnSuccess,
                            error: OnError
    });


    function OnSuccess(data,status,request) {
        var modificable_column_names = [];

        $.each(data.column_name, function(index, value) {
            modificable_column_names.push(value);
        });

        alert(modificable_column_names);

        return modificable_column_names;
    }
}

当我提醒 modificable_column_names 数组时,它在 get_write_user_values() 函数中工作,但不在 get_non_authorized_bulk_edit_option_values() 函数中工作(我得到未定义)。 我尝试使用对象或字符串而不是表格,但我遇到了同样的问题。 为什么它不起作用?

PS:我在那里有一个同步调用,因为在继续之前我绝对需要这个函数的结果(我知道这不是最好的选择)。

【问题讨论】:

  • 永远不要使用async: false。这是一种可怕的做法,已被弃用。查看浏览器控制台中抛出的警告。永远不需要使用它。
  • @Max 请检查我编辑的答案
  • 你得到undefined 因为get_write_user_values 没有返回任何东西。

标签: javascript jquery ajax return


【解决方案1】:

您实际上并没有从 get_write_user_values() 函数返回任何内容。此函数只是启动 ajax 调用并立即返回,甚至在 ajax 调用完成之前返回 undefined。在某个阶段,您的 onSuccess 函数将使用数据调用,但到那个阶段,您的 get_non_authorized_bulk_edit_option_values() 函数已经运行并处理了未定义的值。您需要使用 jquery ajax 提供的 promise api。

function get_write_user_values() {
    var promise = $.ajax({ ... }) // remove the success and error handlers 
    .then(onSuccess, onError)

    function onSuccess(data) {
       // do stuff to the data
       return processed_data;
    }
    function onError(err) {
        console.log('An error with the api');
        return err;
    }

    return promise;
 }

function get_non_authorized_bulk_edit_option_values() {
   get_write_user_values()
   .then (function (processed_data) {
        alert(processed_data);
    });
}

这将确保 get_non_authorized_bulk_edit_option_values 中的代码在执行警报之前将等待来自 ajax 调用的数据到达。

如果您不熟悉 jquery 承诺,请阅读 https://api.jquery.com/deferred.then/

【讨论】:

  • 谢谢。我试过了,但我得到:“Uncaught ReferenceError: onSuccess is not defined”,即使我有 onSuccess 函数(并且成功和错误处理程序已从 ajax 声明中删除)。
  • 检查你的函数名的大小写,我注意到你的是 OnSucces,大写 O,我的是小写。还可以进行小忍者编辑以返回承诺,这很重要:)
  • 是的,我想知道它的去向。完美,现在它正在工作!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多