2017-08-24 6 views
0

Salut c'est ma première fois affaire à la technique long polling pour une application dans le chat, la recherche dans le filet, je trouve que la façon de le mettre en œuvre en utilisant JavaSrciptJQuery, comment puis-je mettre en œuvre en utilisant seulement native JavaScript et node.js? Pouvez-vous guider certains articles ou matériaux à ce sujet? merciComment utiliser l'interrogation longue dans JavaScript et node.js natifs?

+0

Je vous suggère de jeter un coup d'œil sur les sockets au lieu de longues interrogations, c'est plus efficace que de longues interrogations https://stackoverflow.com/questions/10028770/in-what-situations-would-ajax-long-short-polling -be-preferred-over-html5-websock (ps: je viens de savoir ce qui est long sondage donc je ne peux pas vous aider avec votre question) – Frankusky

+1

salut, je ne suis pas autorisé à utiliser des prises, c'est une exigence dans mon projet, bien que les prises est plus professionnel, et je l'ai utilisé dans mon projet précédent – user8244016

Répondre

2

Q: Comment faire longue interrogation en natif Javascript en nodeJS?

A: je suppose tout d'abord vous devez comprendre comment fonctionne le modèle de vote à long. Si vous n'avez aucune idée alors le RFC-6202 specification est un bon point de départ.

Dans le cas où vous êtes paresseux à lire. Il s'agit du client qui envoie un request au server et attend jusqu'à ce qu'une réponse soit renvoyée. D'après la spécification, nous savons d'abord que le client devra émettre une requête http qui a une valeur de temporisation infinie ou au moins élevée. Ensuite, le serveur, qui est votre application nodeJs devrait stocker toutes les demandes entrantes dans une structure de données, essentiellement une zone d'attente. Votre application conservera essentiellement tout l'objet response jusqu'à ce qu'un événement soit déclenché, puis vous répondrez aux réponses de manière appropriée.

Tenir compte de ce code pseudo:

const express = require('express'); 
const app = express(); 
const bodyParser = require('body-parser'); 

var requestCounter = 0; 

var responses = { 
    /* Keyed by room Id =*/ 
    "room_abc" : [ /* array of responses */] 
}; 

app.get('/', function (req, res) { 
    requestCounter += 1; 

    var room = /* assuming request is for room_abc */ "room_abc"; 

    // Stash the response and reply later when an event comes through 
    responses[room].push(res); 

    // Every 3rd request, assume there is an event for the chat room, room_abc. 
    // Reply to all of the response object for room abc. 
    if (requestCounter % 3 === 0) { 
     responses["room_abc"].forEach((res) => { 
      res.send("room member 123 says: hi there!"); 
      res.end(); 
     }); 
    } 
}); 

app.use(bodyParser.text({ type: 'text/*' })); 
app.use(bodyParser.json()); 

app.listen(9999, function() { 
    console.log('Example app listening on port 9999!') 
}) 

Il est temps relativement long à écrire un exemple de travail ici, mais le code ci-dessus est un bon exemple de la façon dont vous pouvez mettre en œuvre à long sondages dans NodeJS.

Si vous avez installé postman ou curl vous pouvez le faire HTTP appels à http://localhost:9999/ en utilisant la méthode GET. Vous devriez noter que sur les deux premiers appels, vous n'obtiendrez pas de réponse et que c'est lorsque vous avez déclenché le troisième, vous recevrez une réponse pour tous les appels précédents et en cours.

L'idée ici est de stocker d'abord l'objet response de la requête et lorsqu'un événement survient, en supposant à chaque 3ème appel HTTP, vous parcourez ensuite toutes les réponses et y répondez. Pour le cas de votre application de chat, l'événement qui déclenche une réponse serait probablement lorsque quelqu'un envoie un message à une salle de discussion.

+0

salut et merci de répondre, mais j'ai une question s'il vous plaît, quand un utilisateur envoie un message à la salle, puis-je remplacer la dernière condition avec un qui vérifie s'il y a nouveaux messages par valeur de compteur, c'est-à-dire si la valeur du compteur est plus grande que ce que j'ai déjà, alors il y a un nouveau message qui devrait être affiché sur le chat de la pièce, n'est-ce pas? une autre chose s'il vous plaît, comment puis-je "appeler" le serveur du côté du client en utilisant javascript natif? – user8244016

+0

Je suppose que vous devrez avoir deux points de terminaison. Un pour le client de se garer et tenir pour des réponses. Ceci est démontré ci-dessus. Puis un autre pour le client pour poster un message de discussion.Quand un message est écrit, vous devez parcourir tous les objets 'response' de cette pièce et y répondre de manière appropriée. –

+0

Cordialement à votre autre question sur la façon dont un client peut envoyer faire un appel de repos «HTTP». Référez-vous à https://developer.mozilla.org/en-US/docs/Web/API/Request par exemple –