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

how to add additional parameters to a callback function in javascript

本文关键字:添加 函数 参数 回调 javascript      更新时间:2024-02-04

在我的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){
        //...
    }
);

这是你想要的吗?