在Javascript函数中从PHP查询返回对象的问题

时间:2014-09-01 11:32:39

标签: javascript jquery

我有以下javascript代码:

    function requestUserList(){
      //El primer paso es obtener de PHP toda la información de los usuarios
      var ret;
      jQuery.ajax({
            type: "POST",
            url: 'userfunctions.php',
            dataType: 'json',
            data: {functionname: 'all_user_data'},
            success: function (obj) {
//                if (obj.error == ""){                 
//                  for (i = 0; i < obj.users.length; i++){
//                    addAUser(obj.users[i],i);
//                  }
//                }
//                else{
//                  postErrorMessage(obj.error);
//                }
                  console.log("Number is " + obj.users.length);
                  ret = obj;
                }
        }); 
    console.log("Going back. N is " + ret.users.length);
    return ret;
    }

问题是消息&#34;号码是&#34;在控制台中以正确的值打印。但是在第二个控制台上打印(&#34;回去.N是&#34;)我得到的错误是用户不是未定义的属性。我不确定地错误地分配了返回值,但我不知道为什么。谁能帮我?我希望obj成为函数的返回。

2 个答案:

答案 0 :(得分:0)

您的功能是异步的,因此您无法以这种方式返回所需的值,您可以使用回调承诺,这是您的情况的回调示例:

function requestUserList(callback){
    jQuery.ajax({
        type: "POST",
        url: 'userfunctions.php',
        dataType: 'json',
        data: {functionname: 'all_user_data'},
        success: function (obj) {
            callback(obj);
        }
    }); 
}

requestUserList(function (obj) {
    console.log(obj);
});

答案 1 :(得分:0)

您有一个可变范围错误。 var ret;仅为函数范围定义ret。然后使用新范围声明一个新函数,该范围隐式声明第二次ret。

这样第一次撤退与第二次撤退完全无关。你需要在成功函数中调用ret所需的任何东西。现在返回不会将值返回给你的函数,而是返回jQuery.ajax调用 - 并且在调用之后它会消失。

另外AJAX是异步的。这意味着你不知道什么时候会完成 - 因此,你不能从那里返回值。至少以明智的方式。

getSomething = function () {
    $.ajax({
        url: url,
        data: "",
        type: 'GET',
        success: doSuccessStuff,
        error: doErrorStuff,
    });
};

doSuccessStuff = function (data) {
  // Have your stuff in data like data.myVariable
};

您可以将AJAX切换为同步 - 然后从成功函数中获取值,如下所示:

getSomething = function () {
    $.ajax({
        url: url,
        data: "",
        type: 'GET',
        success: doSuccessStuff,
        error: doErrorStuff,
        async: false
    });
};

doSuccessStuff = function (data) {
  // Have your stuff in data like data.myVariable
};

然而,这是一种不好的做法,因为它会停止你的程序流程,直到它超时或得到回复。最好坚持在成功调用中正向执行链接函数。