Comment attendre un WebSocket readyState pour changer
Je suis en train de mettre en œuvre un WebSocket avec un repli à une interrogation. Si la connexion WebSocket réussit, readyState
devient 1, mais si elle échoue, readyState
est de 3, et je commence à interroger.
J'ai essayé quelque chose comme ceci:
var socket = new WebSocket(url);
socket.onmessage = onmsg;
while (socket.readyState == 0)
{
}
if (socket.readyState != 1)
{
//fall back to polling
setInterval(poll, interval);
}
Je m'attendais à socket.readyState
de mettre à jour de manière asynchrone, et permettez-moi de le lire immédiatement. Cependant, lorsque je l'exécute, mon navigateur se bloque (je l'ai laissé ouvert pendant environ une demi-minute avant d'abandonner).
J'ai pensé que peut-être il y avait un onreadyStateChanged
événement, mais je n'ai pas vu un seul dans le MDN référence.
Comment dois-je être mise en œuvre? Apparemment vide, la boucle ne fonctionne pas, et il n'y a aucun événement pour ce.
- Hum... je suis peut-être raté quelque chose, mais pourquoi n'utilisez-vous pas
socket.onopen
? - Je ne pense pas que
socket.onopen
se déclenche si la prise n'est jamais ouvert. - Oui, mais que votre code faire dans ce cas? "D'attente pour socket ouvert" n'est évidemment pas une réponse, je suppose. )
- Il devrait revenir à l'interrogation si la prise ne s'ouvre pas.
- Je suis encore un peu perdu, désolé, mais quel est le problème avec l'aide de
onerror
gestionnaire d'événement pour cela? - Ne
onerror
feu dans ce cas, lorsque readyState va de 0 à 3 immédiatement? - Je pense que vous êtes à la recherche à
onclose
... - laissez-nous continuer cette discussion dans le chat
Vous devez vous connecter pour publier un commentaire.
C'est simple et ça fonctionne parfaitement... vous pouvez ajouter une condition sur le temps maximal, ou le numéro d'essayer de la rendre plus solide...
if(callback != null){ callback(); }
Ici est une version plus élaborée explication. Tout d'abord, vérifiez le navigateur de l'API, comme tous les navigateurs seront sur les dernières RFC. Vous pouvez consulter le
Vous ne voulez pas exécuter une boucle pour vérifier en permanence la readystate, il est supplémentaire que vous n'avez pas besoin. Une meilleure approche est de comprendre tous les événements relatifs à un readystate changer, et puis de fil de façon appropriée. Ils sont comme suit:
onclose
Un écouteur d'événement pour être appelé lors de la connexion WebSocket readyState changements à FERMÉ. L'auditeur reçoit un CloseEvent nommé "fermer".onerror
Un écouteur d'événement à être appelée lorsqu'une erreur se produit. C'est un simple événement nommé "erreur".onmessage
Un écouteur d'événement à appeler lorsqu'un message est reçu par le serveur. L'auditeur reçoit une classe messageevent nommé "message".onopen
Un écouteur d'événement pour être appelé lors de la connexion WebSocket readyState changements à OUVRIR; cela indique que la connexion est prêt à envoyer et recevoir des données. L'événement est simple avec le nom "ouvrir".JS est entièrement basé sur l'événement, de sorte que vous devez juste le fil de tous ces événements et de vérifier pour la readystate, de cette façon, vous pouvez passer de WS dans les bureaux de vote en conséquence.
Je vous recommande de regarder le Mozilla de référence, il est plus facile à lire que le document RFC et il vous donnera un bon aperçu de l'API et comment il fonctionne: voir https://developer.mozilla.org/en-US/docs/WebSockets/WebSockets_reference/WebSocket
N'oubliez pas de faire un rappel pour une nouvelle tentative si vous avez une défaillance et de sondage jusqu'à ce que le callback de succès de la reconnexion est déclenché.
on
événements à ne pas exposer la fermeture et de la connexion. Seulement onopen, onclose et les événements d'erreur. Je ne veux pas être l'envoi d'un message en bas d'un ws en clôture de l'etat.Regard sur http://dev.w3.org/html5/websockets/
De la recherche pour "gestionnaire d'Événement" et de trouver la Table.
onopen -> ouvrir
onmessage -> message
onerror ->erreur
onclose ->close
Je ne suis pas à l'aide de mise en commun à tous. Au lieu de cela, j'utilise la file d'attente.
Je crée d'abord de la nouvelle fonction d'envoi et une file d'attente:
Puis j'ai besoin de lire et d'envoyer lorsque la connexion est établie la première fois:
Connexion WebSocket dans cet exemple est créé uniquement sur le premier clic. Généralement, sur la deuxième messages commencent à être envoyé directement.
Votre boucle while est probablement le blocage de votre fil. Essayez d'utiliser:
if
est nécessaire pour quoi exactement?readyState
n'est pas mis à jour immédiatement. C'est pourquoi j'ai utilisé une boucle.socket.readyState === 0
, je vais essayer de ne pas laisser quoi que ce soit jusqu'à l'assomption.readyState
est égale à zéro, et que c'est d'attendre.Dans mon cas d'utilisation, j'ai voulu montrer un message d'erreur sur l'écran si la connexion échoue.
Noter que dans Safari (9.1.2) n
error
événement est déclenché - sinon je l'aurais placé dans le gestionnaire d'erreur.Tout comme vous avez défini un
onmessage
gestionnaire, vous pouvez également définir unonerror
gestionnaire. Celle-ci sera appelée lorsque la connexion échoue.onerror
. Il n'a pas été exécutée. Je suis sûr que le serveur n'est pas de clôture immédiatement, soit, depuisonopen
n'est pas de courir. Je pense que, plutôt que d'une erreur, le serveur rejette la connexion.