[英]how to add additional parameters to a callback function in javascript
在我的javascript XMPP项目中,有一个核心部分和一个插件部分。 核心部分必须独立于插件部分。 我正在尝试从插件部分调用核心功能,而它本身需要调用插件功能。 因为从概念上讲核心部分不知道任何插件功能,所以我试图将插件功能作为回调函数移交给。 它去了:
有strophe库和muc 插件 ,它们具有join
函数 。
我自己在内核中添加了一个函数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
- 功能 ,但现在这里是棘手的部分:事实上,我需要三个参数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)
作为参数core.joinMuc
但在一个无限循环崩溃的浏览器结束了。
您应该能够使用匿名函数,该匿名函数最终以所需的参数调用core.onMessage
:
core.joinMuc(
chatroom,
function(message) {
core.onMessage(message, plugin.doHtml, plugin.doPlain);
},
core.onPresence,
core.onRoster,
function(result){
//...
}
);
这是你想要的吗?
一种可能性:
// 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
并有可能重构,以避免他们,但是这可能是一个简单的方法来走了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.