web-dev-qa-db-fra.com

Javascript - Utiliser Promises sur Websocket?

J'utilise Websockets en Javascript pur et je veux implémenter Promises dans les fonctions de Websocket. Je ne reçois aucune erreur mais la promesse ne fonctionne pas.

En utilisant le code suivant, je peux me connecter avec succès au serveur de sockets mais la promesse semble être ignorée car la sortie de l'alerte est toujours "en échec".

Quelqu'un sait-il quel est le problème dans ce cas? Ps: J'ai effectué les tests dans le dernier navigateur Google Chrome et dans le dernier navigateur Mozilla Firefox.

function Connect()
{
    server = new WebSocket('mysite:1234');

    server.onopen = (function()
    {
        return new Promise(function(resolve, reject) 
        {
            if (true)
            {
                resolve();
            }
            else
            {
                reject();
            }
        });
    }).then = (function()
    {
        alert('succeeed');
    }).catch = (function()
    {
        alert('failed');
    });
}
7
Piet

Votre tentative d'utiliser les promesses avec la nouvelle connexion semble un peu erronée. Vous voudrez renvoyer une promesse de connect() afin de pouvoir l'utiliser pour savoir quand le serveur est connecté. 

Il semble que vous souhaitiez probablement quelque chose comme ceci:

function connect() {
    return new Promise(function(resolve, reject) {
        var server = new WebSocket('ws://mysite:1234');
        server.onopen = function() {
            resolve(server);
        };
        server.onerror = function(err) {
            reject(err);
        };

    });
}

Ensuite, vous l'utiliseriez comme ceci:

connect().then(function(server) {
    // server is ready here
}).catch(function(err) {
    // error here
});

ou avec async/await comme ceci:

async myMethod() {
  try {
      let server = await connect()
      // ... use server
  } catch (error) {
      console.log("ooops ", error)
  }
}
14
jfriend00

J'ai fait face exactement au même problème et créé de minuscules websocket-as-promise library. Il renvoie les promesses de connexion/déconnexion et d’envoi de messages:

const WebSocketAsPromised = require('websocket-as-promised');
const wsp = new WebSocketAsPromised();

// connect
wsp.open('ws://echo.websocket.org')
  .then(() => console.log('Connected.')) 
  // send data and expect response message from server
  .then(() => wsp.sendRequest({foo: 'bar'}))
  .then(response => console.log('Response message received', response))
  // disconnect
  .then(() => wsp.close())
  .then(() => console.log('Disconnected.'));

En ce qui concerne les messages, il existe deux options:

  1. si vous envoyez des données et attendez un message de réponse, vous pouvez utiliser promesse via la méthode .sendRequest():

    wsp.sendRequest({foo: 'bar'}); // returns promise
    // actually sends message with unique id: {id: 'xxxxx', foo: 'bar'}
    // promise waits response message with the same id: {id: 'xxxxx', response: 'ok'}
    
  2. si vous voulez juste envoyer un message et n'attendez pas de réponse - utilisez la méthode .send():

    wsp.send(data); // returns undefined
    
4
vitalets

Pour étendre la réponse @ jfriend00, sa réponse tente de créer une nouvelle connexion chaque fois que la méthode connect est appelée et ne prend pas en compte le cas où la connexion est fermée. 

function getSocket() {

  if (getSocket.server && getSocket.server.readyState < 2) {
    console.log("reusing the socket connection [state = " + getSocket.server.readyState + "]: " + getSocket.server.url);
    return Promise.resolve(getSocket.server);
  }

  return new Promise(function (resolve, reject) {

    getSocket.server = new WebSocket(SOCKET_URL);

    getSocket.server.onopen = function () {
      console.log("socket connection is opened [state = " + getSocket.server.readyState + "]: " + getSocket.server.url);
      resolve(getSocket.server);
    };

    getSocket.server.onerror = function (err) {
      console.error("socket connection error : ", err);
      reject(err);
    };
  });
}

et de l'utiliser 

getSocket().then(function(server) {
  // do stuff
}).catch(function(err) {
    // error here
});

ou avec async/wait

const socket = await getSocket();
1
Hyyan Abo Fakher