J'essaye de recevoir un fichier json avec socket.on
après une émission d'événement et d'utiliser cette réponse dans un autre fichier. Ma connaissance des sockets est assez limitée. Voici le code.
fichier principal:
var socketIo = require('socket.io-client'); var socket = socketIo('http://localhost:9096'); exports.emitMsg = async function() { socket.emit('getSchema', () => {}); } socket.on('resJson', (response) => { exports.receivedSch = response; return response; });
De toute évidence, la valeur de receiveSch
n'est pas définie. P >
client.js
const socketclass = require('../public/socket/client'); await socketclass.emitMsg(); let val = socketclass.receivedSch; console.log(val);
L'événement resJson
et le fichier JSON sont reçus via le 9096
port correctement depuis un autre serveur. Je ne sais tout simplement pas comment attendre de recevoir l'événement avant de let val = socketclass.receivedSch;
Le simple renvoi de réponse
fonctionnerait également pour mon recherche, mais je ne sais pas comment le renvoyer depuis le socket.on
3 Réponses :
Veuillez suivre les étapes données pour y parvenir.
1) Incluez const EventEmitter = require ('events');
dans votre fichier.
2) Créer un émetteur d'événements objet avant socket.on
myEmitter.on('got_response', function(data) { //console.log(data); });
3) Recevez votre réponse en utilisant votre objet myEmitter
.
const myEmitter = new EventEmitter(); socket.on('resJson', (response) => { exports.receivedSch = response; myEmitter.emit('got_response', response); //emit event (important) });
Cela pourrait vous aider.
Votre exports.emitMsg
ne fait pas ce que vous pensez qu'il devrait, le mot-clé async
ici ne fait absolument rien à part renvoyer une promesse qui se résout à undefined.
Parce que votre socket.emit
est une fonction de rappel, vous voudrez l'envelopper dans une nouvelle promesse
.
Alors essayez ->
let val = await socketclass.emitMsg();
Pour que votre ack
ait un sens, vous pouvez également utiliser le résultat comme->
exports.emitMsg = function() { return new Promise((resolve) => { socket.emit('getSchema', resolve); }); }
p >
@George C'est difficile à dire, car le code du serveur n'est pas affiché ici. Mais si vous voulez une réponse de type ACK / NAK
, utiliser «on» ici n'est pas vraiment la meilleure option. L'OP ne réalise peut-être pas que vous pouvez obtenir une réponse d'un emit si vous utilisez le rappel ack
.
Moi non plus, c'est pourquoi j'ai supprimé mon commentaire, mais vous êtes trop rapide :)
corrigé en utilisant l'application Express:
client.js strong> p> et nécessitant ce fichier avant de démarrer l'application: P> var controller = require('./client.js')(app.db.models, app);
controller.write();//method that wil use app.jsonhandler
La fonction
emitMsg
est-elle sur mesure ou est-elle générique?emitMsg
n'est pas une promesse donc ->wait socketclass.emitMsg ();
ne fonctionnera pas. Enveloppez votreexports.emitMsg
dans unenouvelle promesse ()
, ..@Keith c'est un
async code> fonction
, qui renvoie une promesse@George Oui, une promesse qui ne fait rien ,. IOW: une promesse inutile. Placer
async
sur une fonction ne transforme pas automatiquement une fonction de rappel en promesse.@Keith Je suis d'accord que c'est une promesse qui ne fait rien, mais leur recommander d'envelopper la fonction est une promesse ne changera rien. Il n'y a pas de fonctions de rappel dans ce code, mais placer
async
sur une fonction fera que cette fonction retournera une promesse.@George Oui, il y a un callback .. C'est ainsi que fonctionne socket.io ack.
@Keith ohh vous êtes à propos de
socket.emit
, je pensais que vous parliez duemitMsg
lui-même, excusez-moi, j'ai mal compris ce que vous avez dit.