在单个Javascript函数中处理多个websocket订阅,但只处理一个连接对象

时间:2013-10-28 12:30:40

标签: javascript websocket promise autobahn

  

注意:我正在使用Autobahn.js进行客户端WAMP实施,将when.js用于承诺。

我正在尝试创建可重用的代码,以便只存在一个websocket'session'或连接,并且每当dev想要使用autobahn订阅主题时,他们只能使用当前的连接对象来执行此操作如果已经存在;否则会创建一个新的。

我的问题是,如果连接已经存在,我必须使用setTimeout()等待一秒以确保它实际连接,然后复制所有订阅代码 - 我不喜欢这个一点都不。

这是我目前的代码:

(function() {
    var connection = null;

    subscribeTo('subject', __userId, __token, function(onconnect) {
        console.log('Yay, connected');
    });

    function subscribeTo(subject, userId, token, onConnect, onDisconnect) { 
        if (connection === null)
        {   
            connection = new ab.Session('ws://localhost:8080', function(onopen) {

                connection.subscribe(JSON.stringify({subject: subject, userId: userId, token: token}), function(subscription, data) {
                    data = $.parseJSON(data);

                    // Do something with the data ...
                });

                if (typeof onConnect === 'function') { 
                    onConnect(); 
                }

            }, function(onclose) {
                if (typeof onDisconnect === 'function') { 
                    onDisconnect(); 
                }
            }, { 'skipSubprotocolCheck': true });
        }
    }
})();

大。现在的问题是,如果我在前一个之后还有另一个subscribeTo()怎么办?连接不再是null,但也不会连接。以下是我必须做的事情:

// subscribeTo() multiple times at the top ...

subscribeTo('subject', __userId, __token, function(onconnect) {
    console.log('Yay, connected');
});

subscribeTo('anothersubject', __userId, __token, function(onconnect) {
    console.log('Yay, connected');
});

// The first one works, the second one requires a setTimeout() for the connection

// if connection is NOT null...
} else {
    setTimeout(function() {
        connection.subscribe(topic... etc...) // Really!?
    }, 1000);
}

删除setTimeout(),您会收到错误消息,指出“Autbahn未连接”。

有没有更好的方法来获得单一,可重复使用的连接,没有代码重复,或者我注定要为每个订阅创建一个新连接,因为承诺(也许我可以在这里使用promises对我有利,虽然我之前没有使用它们?)

1 个答案:

答案 0 :(得分:5)

这太复杂,不必要和错误。您希望执行subscribe以响应正在创建的会话:

var session = null;

function start() {
   // turn on WAMP debug output
   //ab.debug(true, false, false);

   // use jQuery deferreds instead of bundle whenjs
   //ab.Deferred = $.Deferred;

   // Connect to WAMP server ..
   //
   ab.launch(
      // WAMP app configuration
      {
         // WAMP URL
         wsuri: "ws://localhost:9000/ws",
         // authentication info
         appkey: null, // authenticate as anonymous
         appsecret: null,
         appextra: null,
         // additional session configuration
         sessionConfig: {maxRetries: 10, sessionIdent: "My App"}
      },
      // session open handler
      function (newSession) {
         session = newSession;
         main();
      },
      // session close handler
      function (code, reason, detail) {
         session = null;
      }
   );
}

function main() {
   session.subscribe("http://myapp.com/mytopic1", function(topic, event) {});
   session.subscribe("http://myapp.com/mytopic2", function(topic, event) {});
   session.subscribe("http://myapp.com/mytopic3", function(topic, event) {});
}

start();

ab.launch帮助程序将为您管理自动重新连接(如果需要,还可以进行WAMP-CRA身份验证)。然后,当重新连接发生时,会再次自动调用init()。建议不要使用原始Session对象(除非您知道自己在做什么)。

另外:topic必须是httphttps方案的URI。不允许使用序列化对象(JSON)。