在我的javascript XMPP项目中,有一个核心部分和一个插件部分。核心部分必须独立于插件部分。我试图从插件部分调用核心函数,它本身需要调用一个插件函数。由于核心部分概念不知道任何插件函数,我试图将插件函数作为回调函数。在这里:
strophe-library和muc-plugin包含join
- function。
我自己在核心添加了一个函数joinMuc
,以便它可以有一个回调,原始函数不提供它:
core = {
joinMuc: function(room, onMessage, onPresence, onRoster, result) {
MX.connection.muc.join(
room,
jQuery.jStorage.get('settings').username,
onMessage,
onPresence,
onRoster
);
if (result) result(room);
},
}
我调用core.joinMuc
并传递参数和回调函数:
plugin = {
doHtml: function(result) {
//…
},
doPlain: function(result) {
//…
},
joinGame: function(chatroom){
core.joinMuc(
chatroom,
core.onMessage,
core.onPresence,
core.onRoster,
function(result){
//…
}
);
}
}
core.onMessage
会将实际的xmpp消息作为参数从join
- function获得,但现在这里是一个棘手的部分:我实际上需要{{1}的三个参数移交两个插件函数,在core.onMessage
确定它是什么类型的消息之后应该运行一个插件函数:
core.onMessage
所以现在我的问题是:如何用两个额外的参数调用core = {
onMessage: function (message, handleHTMLMessage, handlePlainMessage){
var rawMessageBody = $(message).find('body').text();
var parsedMessageHtml = $.parseHTML(rawMessageBody)[0];
if ( parsedMessageHtml.nodeName.toLowerCase() == 'foo' ) {
handleHTMLMessage(parsedMessageHtml);
} else {
handlePlainMessage(rawMessageBody);
}
return true;
},
}
?我试图将core.onMessage
作为core.onMessage(plugin.doHtml,plugin.doPlain)
的参数调用,但最终导致浏览器崩溃的无限循环。
答案 0 :(得分:2)
您应该能够使用最终使用所需参数调用core.onMessage
的匿名函数:
core.joinMuc(
chatroom,
function(message) {
core.onMessage(message, plugin.doHtml, plugin.doPlain);
},
core.onPresence,
core.onRoster,
function(result){
//...
}
);
这是你想要的吗?
答案 1 :(得分:2)
一种可能性:
// probably namespaced somewhere, but this is the idea
var createMessageHandler = function(handleHTMLMessage, handlePlainMessage) {
return function(message) {
core.onMessage(message, handleHTMLMessage, handlePlainMessage);
};
};
然后:
plugin = {
doHtml: function(result) { /* ... */},
doPlain: function(result) { /* ... */},
joinGame: function(chatroom){
core.joinMuc(
chatroom,
createMessageHandler(plugin.doHtml, plugin.doPlain),
//…
);
}
}
我并不特别喜欢plugin
内部对plugin
的内部引用,并且可能会重构以避免它们,但这可能是一种简单的方法。