传递函数有一个不起作用的变量

时间:2015-06-01 10:08:07

标签: javascript

我有以下javascript,但现在收到错误:Uncaught TypeError: responseHandler is not a function

var Message = {
    initialMessageList: function(profile_id) {
            $('.messages-list profile'+ profile_id).html = '<div class="message-loader profile"+ profile_id><i class="fa fa-spinner fa-spin"></i></div>';
            Message.fetchMessageList(profile_id, Message.initialMessageListHandler('', profile_id));
        }

        initialMessageListHandler: function(data, profile_id) {
            $('.messages-list .message-loader profile'+ profile_id).remove();
            $('.messages-list profile'+ profile_id).html(Message.getMessageListHtml(data));
            Message.bindMessageList();
            $('.open-message profile'+ profile_id).first().click();
        },

        fetchMessageList: function(query, responseHandler) {
            $.ajax({
                url: '/app/messages/fetch/' + query,
                dataType: 'json',
                method: 'get'
            })
                .done(function(response) {
                    responseHandler(response); <--- this is the line it errors on
                })
                .fail(function(jqXHR) {
                    if (jqXHR.status == 403) {
                        window.location = '/';
                    } else {
                        responseHandler([]);
                    }
                });
        },

这是在改变之后:

initialMessageList: function(profile_id) {
        $('.messages-list profile'+ profile_id).html = '<div class="message-loader profile"+ profile_id><i class="fa fa-spinner fa-spin"></i></div>';
        Message.fetchMessageList(profile_id, Message.initialMessageListHandler);
    },

    initialMessageListHandler: function(data) {
        $('.messages-list .message-loader ').remove();
        $('.messages-list ').html(Message.getMessageListHtml(data));
        Message.bindMessageList();
        $('.open-message ').first().click();
    },

    fetchMessageList: function(query, responseHandler) {
        $.ajax({
            url: '/app/messages/fetch/' + query,
            dataType: 'json',
            method: 'get'
        })
            .done(function(response) {
                responseHandler(response);
            })
            .fail(function(jqXHR) {
                if (jqXHR.status == 403) {
                    window.location = '/';
                } else {
                    responseHandler([]);
                }
            });
    },

2 个答案:

答案 0 :(得分:2)

您收到错误是因为您没有传入函数,而是调用函数的结果,这是添加括号时发生的情况。

NameVirtualHost *:10001
<VirtualHost *:10001>

DocumentRoot /var/www/dev
    <Directory />
        Options +FollowSymLinks
        AllowOverride None
    </Directory>
</VirtualHost>

注意你是如何调用fetchMessageList(profile_id, Message.initialMessageListHandler('', profile_id)); fetchMessageList: function(query, responseHandler) { responseHandler(); // error, "undefined" } 的,它没有返回值,所以它返回undefined,所以你真正在做的是

initialMessageListHandler

你应该做的是

fetchMessageList(profile_id, undefined);

fetchMessageList: function(query, responseHandler) {
    responseHandler(); // error, "undefined"
}

使用匿名函数作为包装器,当你必须传递像

这样的参数时

答案 1 :(得分:0)

另一种方式:您可以bind为您的函数提供所需的参数,例如

Message.fetchMessageList(profile_id, Message.initialMessageListHandler.bind(null,'', profile_id));