在Javascritpt函数中从PHP查询返回对象时出现问题

Problems returning object from PHP query in Javascritpt function

本文关键字:对象 问题 返回 查询 函数 Javascritpt PHP      更新时间:2023-09-26

我有以下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;
    }

问题是控制台中以正确的值打印了消息"Number is"。然而,在第二个控制台打印("Going back.N is")中,我得到了一个错误,即用户不是未定义的属性。不知怎么的,我给返回值赋值不正确,但我不知道为什么。有人能帮我吗?我希望obj是函数的返回。

你的函数是异步的,所以你不能以这种方式返回你想要的值,你可以使用callbackpromise,一个针对你的情况的回调示例:

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);
});

您有一个变量范围错误。var ret;仅为函数范围定义ret。然后在中声明一个新函数,该函数具有第二次隐式声明ret的新作用域。

这样,第一个ret与第二个ret完全无关。您需要在success函数中调用任何需要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
};

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