Javascript 如何从对象获取属性
我使用以下代码检索一个简单的JSON对象: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);
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);