Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从对象获取属性_Javascript_Jquery_Object - Fatal编程技术网

Javascript 如何从对象获取属性

Javascript 如何从对象获取属性,javascript,jquery,object,Javascript,Jquery,Object,我使用以下代码检索一个简单的JSON对象: function userinfo() { var user = new Object(); $.getJSON('###', function(data){ user.id = data.user.uID; user.name = data.user.uname; }); return user; } var user = userinfo(); console.log(user);

我使用以下代码检索一个简单的JSON对象:

function userinfo() {
    var user = new Object();
    $.getJSON('###', function(data){
        user.id = data.user.uID;
        user.name = data.user.uname;
    });
    return user;
}
var user = userinfo();
console.log(user);
在函数外部的用户对象上运行console.log时,可以看到该对象的属性(id、名称)。但当我尝试console.log“user.id”或“user.name”时,它们显示为未定义。我不知道这是为什么,或者我可以做什么来检索属性而不必迭代它们


有什么建议吗?

获取JSON的AJAX调用是异步的,在AJAX返回之前不会调用回调
函数(数据)
,但是在发送AJAX请求之后,但在接收AJAX响应之前,您正在阅读
user

试试这个:

function userinfo() {    
    $.getJSON('###', function(data){
        var user = new Object();
        user.id = data.user.uID;
        user.name = data.user.uname;
        // Do your stuff here
        console.log(user);
    });
}

userinfo();
回复评论: 只需在应用程序上具有如下功能:

function processUser(user){
   console.log(user);
}
然后在AJAX回调中使用它

$.getJSON('###', function(data){
        var user = new Object();
        user.id = data.user.uID;
        user.name = data.user.uname;
        // Do your stuff here
        processUser(user);
    });
@Simon,您现在可以在
processUser()
中执行常用的应用程序逻辑,例如:

var usersList = []; // Assume this is a global for your app

function processUser(user){
   usersList.push(user);
   // now other parts of your app can find this user in the list
}
以下是修复方法:

function userinfo() {
    var user = new Object();
    $.ajax({
        async: false, //solution right here
        url: '/login/user.html',
        success: function (data) {
            user.id = data.user.uID;
            user.name = data.user.uname;
        }
    });
    return user;
}
var user = userinfo();
console.log(user.id);

工作非常完美。

我只想将user.id和user.name从该函数中取出,放到工作区的其余部分。但是,每当我引用用户时,我都需要进行getJSON调用以确保值是准确的。如果不在getJSON调用中包围整个工作区,我如何才能做到这一点?@SimonMunyard将回调传递到您的函数中,该函数将设置value@SimonMunyard这是没有办法的。在您返回之前不会收到响应。您需要将依赖的代码包装在回调中。好的,我可以看到您在那里做什么。让我问一下-我能把processUser()的输出放入一个可以在任何地方使用的变量中吗?@SimonMunyard无论你做什么-在回调赋值之前,你都不能访问该值(这可以任意延迟,无论代码在哪里)。他的原始示例显示需要全局范围内的用户对象(可讨论)。这个版本提供了一个可重用的函数来执行get。我担心这会让询问者误以为他可以在实际可以使用之前使用该值。也许,它确实遵循异步模式。这里的问题是OP不理解什么是异步操作。对于学习者来说,这似乎是一个合理的问题。在现实世界的应用程序中,如果你在任何地方对所有请求都这样做,你会激怒用户,那么这个标题的措辞可以更好地造福后代。您现在不会注意到,因为您可能正在使用非常快速的本地网络响应进行本地开发。你不想仅仅为了等待响应而阻止应用程序的执行流,至少不是在每次调用时!是的,我明白。然而,我已经在一个远程服务器上工作了,应答数据的大小非常小,而且调用也不经常——可能每个会话一次。我使用这种方法是经过深思熟虑的。
function userinfo() {
    var user = new Object();
    $.ajax({
        async: false, //solution right here
        url: '/login/user.html',
        success: function (data) {
            user.id = data.user.uID;
            user.name = data.user.uname;
        }
    });
    return user;
}
var user = userinfo();
console.log(user.id);