簡體   English   中英

如何在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將獲得實際的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM