2010-07-23 4 views
3

Je n'arrive pas à trouver comment accéder aux propriétés de l'objet en Javascript. J'ai une fonction qui renvoie un objet, et je peux voir cet objet et toutes ses propriétés lorsqu'il est connecté à la console dans Safari, mais je ne peux pas obtenir les valeurs de propriété pour d'autres fonctions. Par exemple, essayer d'alerter l'une des propriétés renvoie 'undefined'.Propriétés de l'objet Javascript visibles dans la console, mais indéfinies?

La fonction qui génère un objet


getProfile : function() { 

    FB.api('/me', function(response) { 
    facebook.profile.user_id = response.id; 
    facebook.profile.name = response.name; 
    facebook.profile.firstName = response.first_name; 
    facebook.profile.lastName = response.last_name; 
    facebook.profile.gender = response.gender; 
    }); 

    FB.api('/me/photos', {limit: 8}, function(response) { 
    facebook.profile.numPhotos = response.data.length; 
    for (key in response.data) { 
     var photoUrl = response.data[key].source; 
     eval('facebook.profile.photo' + key + '= photoUrl'); 
    } 
    }); 

    return facebook.profile; 
} 

Tenter d'utiliser cette fonction dans un autre script

 
function loadProfile() { 
    var profile = facebook.getProfile();

console.log(profile); alert(profile.name); }

Répondre

5

La fonction getProfile invoque la fonction API FB FB.api qui exécute une asynchoronous HTTP demande. Dans votre LoadProfile fonction appelez vous appelez getProfile qui retourne immédiatement objet facebook.profile qui ne reçoit des données encore depuis la requête HTTP est pas encore terminée.

Pensez à la modification suivante:

getProfile : function(fCallback) { 
    var bInfo = false, 
     bPhotos = false;  

    FB.api('/me', function(response) { 
    facebook.profile.user_id = response.id; 
    facebook.profile.name = response.name; 
    facebook.profile.firstName = response.first_name; 
    facebook.profile.lastName = response.last_name; 
    facebook.profile.gender = response.gender; 

    bInfo = true; 
    if (bPhotos) 
     fCallback(facebook.profile); 
    }); 

    FB.api('/me/photos', {limit: 8}, function(response) { 
    facebook.profile.numPhotos = response.data.length; 
    for (key in response.data) { 
     var photoUrl = response.data[key].source; 
     eval('facebook.profile.photo' + key + '= photoUrl'); 
    } 

    bPhotos = true; 
    if (bInfo) 
     fCallback(facebook.profile); 
    }); 
} 

et appeler cette fonction de la manière suivante maintenant:

function loadProfile() { 
    facebook.getProfile(function (profile) { 
    alert(profile.name); 
    }); 
} 

La raison pour laquelle ous pouvait voir des champs dans la console est parce que vous introspectés l'objet après la asynch l'appel a été exécuté avec succès. L'appel d'alerte cependant exécuté immédiatement dans le même fil sur un objet pas encore peuplé.

0

Bien que « Sergey Ilinsky » aurait pu envisager un terrain droit, mais il y a plus de choses, qui peuvent être prises en considération. Habituellement vient par erreur, et difficile à déboguer.

Parfois, son cela arrive, que vos clés d'objet contient des espaces, laisser dire:

var myObj = new Object(); 

myObj['key1'] = 'val1'; 
myObj['key2'] = 'val2'; 
myObj['key3 '] = 'val3'; //the key contains spaces here 
myObj['key4 '] = 'val4'; // the key contains spaces here 

donc, lorsque vous vous connectez à la console par console.log(myObj), vous obtiendrez:

Object { key1="val1", key2="val2", key3 ="val3", key4 ="val4"} 

Mais quand vous accédez:

alert(myObj.key1); //Ok: val1 
alert(myObj.key2); //Ok: val2 

alert(myObj.key3); //undefined 
alert(myObj.key4); //undefined 

alert(myObj['key3']; //undefined 
alert(myObj['key4']; //undefined 

Ce sont les zones communes d'erreurs, où un par erreur met l'espace, peut-être en faisant copier-coller, et il arrive, que l'on dit, console log est capable de le montrer, mais je ne peux pas y accéder.

Questions connexes