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