在函数中设置可选回调的最佳方法

时间:2011-11-23 09:36:39

标签: javascript function callback

在这样的函数中,可选成功和错误回调的最佳做法是什么?这种方法有意义吗?对我来说似乎有点臃肿。

功能声明:

var myFunc = function(myNumber, options){
    options = options || {};
    options.onSuccess = options.onSuccess || function(){};
    options.onError = options.onSuccess || function(){};

    var myNewNumber = myNumber * 2;

    if(newVar > 10){
        options.onSuccess(myNewNumber);
    }else{
        options.onError(myNewNumber);
    }
}

使用回调调用

myFunc(2,{
    onError: function(myNewNumber){
        // do stuff
    },
    onSuccess: function(myNewNumber){
        // do stuff
    }
})

在没有回调的情况下调用它:

myFunc(2);

2 个答案:

答案 0 :(得分:4)

需要注意的一些事项;

  1. options.onSuccess = options.onSuccess || function(){};正在检查会员的存在,而不是检查其功能。

    您可能需要options.onSuccess = (typeof options.onSuccess == "function") ? options.onSuccess : function () { };

  2. onError

  3. 也是如此
  4. 与略微优化一样,您可以将空函数指向同一个函数;而不是两次重建它。如果你正在使用jQuery,jQuery定义jQuery.noop()

    options.onSuccess = options.onSuccess || jQuery.noop;
    options.onError = options.onSuccess || jQuery.noop;
    
  5. 在回调是异步的情况下,您将在检查后,但在回调被触发之前,将options.onSuccessoptions.onError更改为开放状态;

    var myFunc = function(myNumber, options){
        options = options || {};
        options.onSuccess = options.onSuccess || function(){};
        options.onError = options.onSuccess || function(){};
    
        var myNewNumber = myNumber * 2;
    
        setTimeout(function () {
            if(newVar > 10){
                options.onSuccess(myNewNumber);
            }else{
                options.onError(myNewNumber);
            }
        }, 2000);
    }
    
    var obj = {
        success: function () { alert('foo'); },
        error: function () { alert('foo'); },
    };
    
    myFunc(10, obj);
    delete obj.success;
    delete obj.error;
    

    执行回调后,successerror将不确定。

答案 1 :(得分:2)

我会通过在调用它们之前检查函数的存在来实现它:

var myFunc = function(myNumber, options){
    options = options || {};

    var myNewNumber = myNumber * 2;

    if(newVar > 10){
        if (options.onSuccess) { options.onSuccess(myNewNumber); }
    }else{
        if (options.onError) { options.onError(myNewNumber); }
    }
}

这取决于您可能会调用这些回调的次数。如果它遍布整个地方,那么您的方式可能会更好,或者至少更清晰的代码。