注意:我正在使用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对我有利,虽然我之前没有使用它们?)
答案 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
必须是http
或https
方案的URI。不允许使用序列化对象(JSON)。