'Javascript - Build an async interface around an async WebSocket

I'm wondering if it is possible to build an async interface around a webSocket object, that is async by nature.

The webSockect object is inside a class/function that publishes a number of methods: I'd like to call this methods, send a command via websocket, wait the reply and recall the standard methods as .then or .catch - thinking like a javascript Promise.

function x() {
    myWS.sendCmdA().then( function() { doSomething; });
}

function myWS(){
  var ws = null;
  this.open = function() {
    ws = new WebSocket(....);
    ws.open = function() { ... };
    ws.onmessage = function () { ... };
  }
  this.sendCmdA = function () {
    ws.send("ABCD");
  }
}

Or it is better to pass a callback function(s) on the call like

myWS.sendCmdA( fnOk, fnErr);

?



Solution 1:[1]

This is the final solution I adopted:

  • added two arrays to store the two possible replies

    var _resolved=[];
    var _rejected=[];
    
  • for each request I defined a Promise as following:

      this.ambd002GetLocks = function(locks){
        return new Promise(
          function( resolve, rejected){
              _resolved['ambd002'] = resolve;
              _rejected['ambd002'] = rejected;
              ws.send("{\"parn1\":"+locks+", \"cmd\":\"ambd002GetLocks\"}");
          }
       );
     }
    
  • when I receive the reply on onmessage handler I check the result and recall one of the stored function, using a specified index:

    ws.onmessage = function got_packet(msg) {
              console.info("RxWs: " + msg.data);
    
              ...
                  case "ambd002GetLocks":
                      if (obj.v=="ok"){
                          _resolved['ambd002'](obj);
                      } else {
                          _rejected['ambd002'](obj);
                      }
                      break;
             ...
    

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 SteMMo