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

在单个Javascript函数中处理多个websocket订阅,但仅处理一个连接对象,javascript,websocket,promise,autobahn,Javascript,Websocket,Promise,Autobahn,注意:我将用于客户端WAMP实现和承诺 我正在尝试创建可重用的代码,以便只存在一个websocket“会话”或连接,并且每当开发人员想要使用autobahn订阅主题时,只要当前连接对象已经存在,他们就可以使用它来订阅;否则会创建一个新的 我的问题是,如果连接已经存在,我必须使用setTimeout()等待一秒钟,以确保它实际已连接,然后复制所有订阅代码-我一点也不喜欢这样 以下是我当前的代码: (function() { var connection = null; subsc

注意:我将用于客户端WAMP实现和承诺

我正在尝试创建可重用的代码,以便只存在一个websocket“会话”或连接,并且每当开发人员想要使用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未连接”


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

这太复杂了,不必要,而且是错误的。您想对正在创建的会话进行
订阅
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身份验证)<代码>初始化()然后在重新连接时自动再次调用。不建议使用原始
会话
对象(除非您知道自己在做什么)


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

这太复杂、不必要且错误。您想对正在创建的会话进行
订阅
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身份验证)<代码>初始化()然后在重新连接时自动再次调用。不建议使用原始
会话
对象(除非您知道自己在做什么)


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

如何自动调用
init()
函数?ab是否在与
start()
相同的范围内查找一个名为init()的函数?在调用
init()
start()函数中,我看不到任何地方。但是,如果它能工作,这就容易多了:-)对不起,从生产代码复制过来的。。错过了
init()
调用
ab.launch
将在第一次连接和每次重新连接时调用第一次回调。下面是一个更完整的示例:我几乎尝试了您的确切代码,但在
函数(newSession)
中没有调用任何内容,即使我的服务器端看到了连接。有什么建议吗?编辑:没关系,我用了
ab.connect
而不是
ab.launch
,效果很好
ab.connect
也会自动重新连接,但不提供身份验证机制(“WAMP-CRA”)。因此,关于内置舒适性,它介于原始
会话
ab.launch
之间。如何自动调用
init()
函数?ab是否在与
start()
相同的范围内查找一个名为init()的函数?在调用
init()
start()函数中,我看不到任何地方。但是,如果它能工作,这就容易多了:-)对不起,从生产代码复制过来的。。错过了
init()
调用
ab.launch
将在第一次连接和每次重新连接时调用第一次回调。下面是一个更完整的示例:我几乎尝试了您的确切代码,但在
函数(newSession)
中没有调用任何内容,即使我的服务器端看到了连接。有什么建议吗?编辑:没关系,我用了
ab.connect
而不是
ab.launch
,效果很好
ab.connect
也会自动重新连接,但不提供身份验证机制(“WAMP-CRA”)。因此,关于内置舒适性,它介于原始
会话
ab.launch
之间。