如何在javascript中向回调函数添加附加参数
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
将从join
-函数中获得实际的xmpp消息作为参数,但现在有一个棘手的部分:我实际上需要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
的参数,但最终出现了一个无限循环,导致浏览器崩溃。
一种可能性:
// 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
的内部引用,可能会进行重构以避免它们,但这可能是一种简单的方法。
您应该能够使用一个匿名函数,该函数最终调用具有所需参数的core.onMessage
:
core.joinMuc(
chatroom,
function(message) {
core.onMessage(message, plugin.doHtml, plugin.doPlain);
},
core.onPresence,
core.onRoster,
function(result){
//...
}
);
这是你想要的吗?
相关文章:
- 如何添加函数中存在的所有参数
- 为新对象添加函数,将对象添加到数组中.理解困难'这'关键字
- 使用元素选择器向Object添加函数
- Javascript 向影子根中的自定义元素添加函数
- 如何在jQuery中添加函数作为自定义事件
- 仅向某个对象添加函数
- jQuery插件返回this.each并为每个对象添加函数属性
- 我可以用Javascript向数组添加函数吗
- HTMLJavascript-如何向输入语句添加函数并隐藏输入语句,除非选中“是”,然后取消隐藏
- jquery在html属性中添加函数回调,以便在其他事件中调用
- 如何向对象添加函数并引用其成员
- 动态添加函数参数
- PHP 添加函数
- 向原型添加函数
- Java 在不使用引号的情况下向 json 对象添加函数
- jQuery向动画队列添加函数
- 向对象原型添加函数的正确方法
- 在 Typescript 中添加函数之前,如何将变量声明为空对象
- 向对象原型添加函数会导致函数显示在所有“OBJ 中的 X”循环中
- 删除并重新添加函数 JavaScript