1

注意:我将Autobahn.js用于客户端 WAMP 实现,而when.js用于承诺。

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

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

这是我当前的代码:

(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 未连接”。

有没有更好的方法来拥有一个单一的、可重用的连接,而不需要重复代码,或者我注定要因为承诺而为每个订阅创建一个新连接(也许我可以在这里使用承诺来发挥我的优势,尽管我没有在此之前没有使用过它们)?

4

1 回答 1

5

这一切都太复杂、不必要和错误了。您想要做您subscribe的 s 以响应正在创建的会话:

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对象(除非您知道自己在做什么)。

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

于 2013-10-28T13:55:20.643 回答