如何在javascript中向回调函数添加其他参数

时间:2013-12-02 18:01:15

标签: javascript parameters callback parameter-passing strophe

在我的javascript XMPP项目中,有一个核心部分和一个插件部分。核心部分必须独立于插件部分。我试图从插件部分调用核心函数,它本身需要调用一个插件函数。由于核心部分概念不知道任何插件函数,我试图将插件函数作为回调函数。在这里:

strophe-librarymuc-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)的参数调用,但最终导致浏览器崩溃的无限循环。

2 个答案:

答案 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的内部引用,并且可能会重构以避免它们,但这可能是一种简单的方法。