Javascript - 传递和查找回调函数

时间:2011-03-06 22:15:34

标签: javascript jquery design-patterns

我正在编写一个小模块,它有几个不同的方面,都基于ajax调用。我想允许主要的ajax函数,即beforeSend,success,complete等(我使用的是jQuery)可以自定义。

这样做的最佳方式是什么?

我目前在模块中有一个选项对象,可以使用传递给init函数的选项对象进行扩展。在这里,我传递一个带有嵌套对象的'回调'对象,用于每个不同类型的操作,如...

        var insertCallbacks = {

        before : function() {

        },
        success : function() {

        },
        error : function() {

        },
        complete : function() {

        }
    };

    var updateCallbacks = {
        before : function() {

        },
        success : function() {

        },
        error : function() {

        },
        complete : function() {

        }
    };

    var callbacks =  {
        insert : addCallbacks,
        update : removeCallbacks    
    };

   MY_MODULE.init( {callbacks : callbacks} );

问题是这会变得有点混乱,在ajax回调上测试每种方法的存在。

任何人都可以为此提供关于良好/更好模式的任何建议。

2 个答案:

答案 0 :(得分:3)

我会使用自定义事件而不是回调。因此,在您的模块中,您将拥有如下代码:

MY_MODULE.trigger('updateComplete');

并且在模块之外的所有部分(以及内部,如果需要),绑定处理程序(现在它们是回调):

 MY_MODULE.bind('updateComplete', function() { 
    alert('update completed'); 
 } );

Custom events in jQuery open doors to complex behaviors,或谷歌任何其他文章。自定义事件将帮助您保持代码结构化,并且更容易测试

添加ON:使用回调,您需要始终检查是否有,所以您的代码变为

if ( callbacks && callbacks.insert ) {
    callbacks.insert();
}

改进模块功能并增强它,有一天你会遇到一种情况,即在相同的情况下应该传递很少的回调(例如,两个实体或UI组件对模块'更新'感兴趣)...它会使你的工作太难了。对于事件,您总是有一个代码行

MY_MODULE.trigger('updateComplete');

没有条件来检查是否附加了任何处理程序(对事件感兴趣),并且您可以为同一事件提供所需数量的处理程序。

答案 1 :(得分:1)

就像jQuery那样做。让您的模块触发事件(通过trigger())并在必要时(通过bind())将处理程序附加到这些事件。这样,您无需在模块内部检查正在侦听的功能(或者根本不是)。

由于您的代码不包含任何我可以用于示例,因此很难在此答案中添加代码。