[英]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.