2010-09-21 4 views
3

Existe-t-il un moyen de passer le contexte dans un rappel javascript facebook sdk api? Voici un exemple simple. Maintenant cela ne fonctionnera pas parce que la variable 'this.name' dans ma fonction de callback serait indéfinie, parce que ce n'est pas dans mon contexte d'objet utilisateur. Une idée de comment le faire?Contexte sur le rappel de l'api sur facebook?

function user(id) { 
this.id = id; 
this.getUserName = function(fields,callback){ 
    FB.api({ 
    method:'fql.query', 
    query: 'SELECT '+ fields.toString() +' FROM profile WHERE id=' + this.id 
    }, 
    callback 
    ); 
} 
this.getUserName(['name'],function(response){this.name = response[0].name;}); 
} 

var amigo = new user('fb_id_here'); 

Répondre

1

Modifier: Ceci n'est qu'une partie de la solution. Apply() peut être utilisé avec des fermetures pour renvoyer une fonction liée à la portée d'un objet (voir le post de Jamie).

Ex:

function bindScope = function(context, obj) 
{ 
    return function() 
    { 
     return obj.apply(context); 
    } 
} 

Je crois que vous pouvez modifier en utilisant javascript Appliquons le contexte(). Essayez de changer la ligne # 8 à callback.apply (this).

ressources sur le contexte & appliquer - http://kossovsky.net/index.php/2009/07/function-context-and-apply-function/

+0

'apply' peut être utilisé ici, mais pas de la façon dont vous expliquez. Il passe un rappel à une autre fonction, en tant que fonction. Si vous avez passé 'callback.apply (this)' à la place, vous passeriez le résultat de l'invocation, pas la fonction elle-même. –

+0

Je recommande fortement de ne pas utiliser 'object' comme nom de variable, étant donné que' Object' est un code JavaScript intégré. Bien que ce ne soit pas techniquement faux, c'est assez déroutant. En outre, cela est sémantiquement faux. 'apply' est une méthode de' fonctions', pas d'objets généraux. –

+0

tks c'est la bonne solution. J'utilise la méthode _.bind() du framework underscore.js qui fait exactement ce que fait votre code. – plehoux

3

Les fermetures sont votre ami.

function user(id) { 
this.id = id; 
this.getUserName = function(fields,callback){ 
    FB.api({ 
    method:'fql.query', 
    query: 'SELECT '+ fields.toString() +' FROM profile WHERE id=' + this.id 
    }, 
    callback 
    ); 
} 
this.getUserName(['name'],(function(this_user) { 
    return function(response){this_user.name = response[0].name;} 
})(this)); 
} 

var amigo = new user('fb_id_here'); 
+0

Je ne comprends pas votre code, mais vos conseils de recherche de fermeture m'a conduit à une bonne solution. tks. – plehoux