Comment puis-je utiliser un FB.api JS(SDK) réponse en dehors de la fonction de rappel?
Je ne suis pas d'avoir des problèmes avec la connexion ou même l'appel de l'api, j'ai juste un problème avec l'obtention de la réponse en dehors de l'api par callback. Je sais qu'il s'exécute de façon asynchrone, donc je tiens à le mettre dans une fonction qui retourne la réponse. Voici mon idée
//What I would like to be able to do
function fbUser(){
FB.api('/me', function(response){
//this logs the correct object
console.log(response);
});
//How do I get the response out here?
return response;
}
Je voudrais appeler le /me fonction de l'api une fois au début et ensuite de le passer autour de mon point de vue, les objets (je viens d'utiliser la réponse à l'intérieur de l'épine Dorsale de Vues) et selon ce qui est nécessaire de faire d'autres appels de l'api. J'ai actuellement certaines choses de travail par l'appel de la vue de l'intérieur de la fonction de rappel
//What I am doing now, but I lose the ability to pass anything other than the
//the current response to this function/View
FB.api('/me', function(response){
var newView = new facebookView({model: response});
});
Je orginally a été d'essayer cela, mais parce que les appels aux api asynchrone j'ai eu des problèmes avec les choses étant pas défini
//What I started with but had async issues
var fbResponse;
FB.api('/me', function(response){
fbResponse = response;
});
//I would then try and use fbResponse but it would be undefined
Je perds la première réaction, quand je fais la deuxième. Par exemple, mon premier appel d'api est /moi pour obtenir les infos de l'utilisateur. Je peux alors appel /votre-fb-id/photos et d'obtenir des photos, mais si je fais appel à une autre fonction à l'intérieur de la photo de l'api callback je ne peut faire référence à la réponse que j'ai perdu l'original /me réponse. Si je pouvais avoir la réponse de la fonction de rappel, alors je voudrais être en mesure de passer en tant que de besoin. Je comprends que la réponse n'est valable à l'intérieur de la fonction de rappel, alors comment puis-je la rendre valide à l'extérieur de la fonction de rappel tout en prenant en compte c'est asynchronousness?
OriginalL'auteur Joshua | 2011-10-04
Vous devez vous connecter pour publier un commentaire.
OK tout le monde je compris cela. Il m'a fallu du temps et à la lecture de plusieurs pages différentes. Ce que j'ai dit que je voulais faire toutes les transactions avec des rappels et des fermetures. Je vais couvrir tout d'abord le rappel de problème. Parce que le FB.la fonction de l'api est asynchrone, vous ne savez jamais quand il sera de retour. Vous pouvez arrêter de Javascript ou de régler une minuterie, mais c'est une horrible façon de le faire. Vous avez besoin d'un rappel. En fait, le FB.l'api est à l'aide d'une fonction de rappel. C'est ce que la fonction anonyme comme le deuxième paramètre est. Ce que j'ai fait était de créer une autre fonction qui a appelé fbUser et utilisé une fonction de rappel. Voici ce que j'ai fait:
La startThis fonction est appelée sur une note positive Facebook auth réponse. Il appelle ensuite la fbUser fonction qui a un rappel. Le callback retourne le rappel de la FB.la fonction de l'api. Parce que startThis utilise que de rappel avec la valeur de retour d'être appelé modèle, le code ne sera pas exécuté tant que la callback retourne. Pas plus pas défini de questions. Ces fonctions sont juste des wrappers pour obtenir le Facebook de réponse à mon point de vue. J'ai peut-être ajouté un trop grand nombre de couches d'abstraction, mais si vous voulez passer autour de la réponse c'est la manière.
Deuxièmement je voulais transmettre cette réponse sur un autre point de vue. Par exemple, un point de vue des charges des infos de base (en utilisant la réponse de fbUser). Je veux maintenant passer qu'un autre point de vue qui se charge des photos (je sais que ce n'est pas des meilleures pratiques MVC, mais en utilisant Facebook je n'ai pas beaucoup de contrôle sur le Modèle). Le problème que j'avais était bien, je ne pouvais pas laisser passer l'original de la réponse à la vue suivante parce qu'à l'intérieur de la fonction de rappel pour le FB.les appels de l'api
this
se réfère à laWindow
et non pas de l'objet, j'ai été dans. Solution: des fermetures. Je ne vais pas expliquer ce parfaitement, mais une fermeture est une variable locale à l'intérieur d'une fonction qui a encore une référence à l'intérieur d'une fonction anonyme. Voici ma solution qui devrait illustrer ce dont je parle:La fonction loadPhoto est un wrapper pour charger une photo de la vue (je sais épine dorsale peut m'aider avec le chargement de différents points de vue, mais j'ai été la lutte contre un problème à la fois). Il prend la photo de l'appel d'api comme le modèle, un certain nombre d'un décalage, et la origanl réponse. La première ligne dans cette fonction à une variable locale. Qui me permet à l'intérieur de l'anonyme en fonction de rappel pour faire référence à l'objet de cet été appelé à partir.
J'espère que cela peut aider quelqu'un que j'ai passé beaucoup d'heures de travail et beaucoup de temps de test pour trouver la solution à cette question. Si vous ne savez pas comment des rappels ou des fermetures de travail, il est difficile de trouver l'information que vous recherchez.
OriginalL'auteur Joshua