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