2011-11-16 3 views
0

J'essaie de créer un petit framework javascript qui peut le rendre plus facile lorsqu'il s'agit d'une bibliothèque tierce. Cette bibliothèque est principalement asynchrone, par exemple pour établir une connexion que vous utilisez le code:Encapsuler les demandes asynchrones

var com = establishConnection("api-key"); 
com.onsuccess = function(c) { 
    c.submit("something"); 
}; 

Ce que je veux être en mesure d'utiliser mon cadre de wrapper pour être en mesure de faire simplement

var com = establishConnection("api-key"); 
com.submit("something"); 

Évidemment, bien que j'ai besoin d'un moyen de gérer la nature asynchrone de la bibliothèque d'origine, il attendra jusqu'à ce que la connexion soit établie avant d'exécuter les commandes. Je sais que je peux faire quelque chose comme mettre un drapeau pour dire si oui ou non la connexion est établie, puis utiliser une sorte de retard en boucle, à savoir

function submit(msg) { 
    while (!connectionEstablished) {} 
    // do submit stuff 
} 

, mais il semble que cette bidouille horrible, ce que quelqu'un a des conseils pour de meilleurs moyens de le faire?

Répondre

0

Ce serait le seul moyen de convertir une requête asynchrone en une requête synchrone.

Oui, il semble horrible, et laid; parce que c'est.

Je sais que je ne connais pas le plein et Out de votre bibliothèque, mais je vous suggère (et vos utilisateurs) devrait embrasser requêtes asynchrones plutôt que d'essayer de masque les. Les requêtes HTTP sont asynchrones en JavaScript pour une raison; ils ne verrouillent pas le navigateur. Les requêtes synchrones verrouillent complètement le navigateur pendant la durée de la requête. Si vous ne faites pas attention, si la requête HTTP est trop longue, vos utilisateurs recevront une alerte sur la plupart des navigateurs en leur disant que le script a cessé d'être exécuté; et leur offre la possibilité de désactiver le script.

+0

Oui, je suis d'accord, malheureusement, il y a quelques points où je vais avoir pour masquer l'asynchronicité, et j'espérais juste une meilleure solution. La plupart du temps, les requêtes asynchrones sont assez rapides, elles passent toutes par un serveur local, mais je suppose que je peux juste être sélectif sur le comportement que je masque et bloquer uniquement lorsque c'est absolument nécessaire. Merci quand même –

Questions connexes