Comment appeler une fonction JavaScript asynchrone et bloquer l'appelant d'origine

J'ai une situation intéressante que ma habituellement malin esprit n'a pas été en mesure de trouver une solution 🙂 Voici la situation...

J'ai une classe qui a une méthode get ()... cette méthode est appelée à se stocker les préférences de l'utilisateur... ce qu'il fait est d'appels sur certains fournisseur sous-jacent à réellement obtenir les données... comme l'écrit maintenant, c'est l'appel à un prestataire qui parle des cookies... alors, get() appelle providerGet() disons, providerGet() renvoie une valeur et get() passe ainsi que de l'appelant. L'appelant attend une réponse avant de continuer son travail évidemment.

Ici la partie la plus délicate... maintenant, je suis en train de mettre en œuvre un fournisseur qui est asychronous dans la nature (à l'aide de local de stockage dans ce cas)... donc, providerGet() serait de retour tout de suite, avoir envoyé un appel local de stockage qui, quelques temps plus tard, une fonction de rappel qui lui a été transmis... mais, depuis providerGet() déjà retourné, et n'a donc get() maintenant, par extension, à l'origine appelé, il est évident qu'elle n'a pas retourné le réel des données récupérées.

Donc, la question est simple est-il un moyen de "bloquer" le retour de providerGet() jusqu'à ce que le asychronous retours d'appel? Notez que pour mes fins, je ne suis pas concerné par la performance des implications que cela peut avoir, j'essaie juste de comprendre comment le faire fonctionner.

Je ne pense pas qu'il y a un moyen, certes, je sais que je n'ai pas été en mesure de venir avec elle... donc je voulais jeter un œil et voir ce que les autres peuvent venir avec 🙂

edit: je suis en train d'apprendre maintenant que le cœur du problème, le fait que le web API sql est asychronous, peut-être une solution... se trouve qu'il existe une version synchrone de l'API ainsi, quelque chose que je ne savais pas... je suis en train de lire à travers docs maintenant à voir comment l'utiliser, mais qui permettrait de résoudre le problème bien puisque la seule raison providerGet() a été écrit asychronously à tous, c'était pour permettre au fournisseur... le code que get() est une partie de mon propre couche d'abstraction au-dessus de différents fournisseurs de données (cookies, web, sql, localStorage, etc) de sorte que le plus petit dénominateur commun est de gagner, ce qui signifie que si l'un est asychronous ils ont TOUS à être asychronous... le seul qui a est web sql... donc si il y a un moyen de le faire de manière synchrone mon point discutable (encore une question intéressante, de manière générique, je pense que si)

edit2: Ah bien, sans y aider, il semble... me semble que la version synchrone de l'API n'est pas implémenté dans n'importe quel navigateur et même si c'était il est spécifié qu'il ne peut être utilisé à partir de threads de travail, de sorte que cela ne semble pas comme il faudrait aider de toute façon. Bien que, la lecture de certains autres choses, il sonne comme il ya une façon de s'en sortir de cette astuce en utilisant la récursivité... je suis de jeter ensemble des tests de code de maintenant, je vais le poster si/quand-je obtenir ce travail, semble être un moyen très intéressant pour obtenir autour de la situation d'une manière générique.

edit3: Comme pour mon commentaires ci-dessous, il n'y a vraiment aucun moyen de faire exactement ce que je voulais. La solution que je vais à résoudre mon problème immédiat est tout simplement de ne pas permettre l'utilisation de web SQL pour le stockage de données. Ce n'est pas la solution idéale, mais que cette spécification est en perpétuelle évolution et ne sont pas largement mis en œuvre, de toute façon c'est pas la fin du monde... j'espère quand son correctement pris en charge la version synchrone sera disponible et je peux brancher un nouveau fournisseur et être bon d'aller. De manière générique, cependant, il ne semble pas être un moyen de tirer de ce miracle... confirme ce que j'attendais c'était le cas, mais j'ai eu tort cette fois-ci 🙂

source d'informationauteur Frank W. Zammetti | 2011-12-09