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

Javascript 在函数中设置可选回调的最佳方法,javascript,function,callback,Javascript,Function,Callback,在这样的函数中,可选的成功和错误回调的最佳实践是什么?这个方法有意义吗?我觉得有点浮肿 函数声明: var myFunc = function(myNumber, options){ options = options || {}; options.onSuccess = options.onSuccess || function(){}; options.onError = options.onSuccess || function(){}; var myNe

在这样的函数中,可选的成功和错误回调的最佳实践是什么?这个方法有意义吗?我觉得有点浮肿

函数声明:

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);
通过回调调用它:

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);
在不回调的情况下调用它:

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);

在调用函数之前,我会检查函数是否存在:

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); }
    }
}

这取决于您可能调用这些回调的次数。如果它到处都是,那么您的方式可能会更好,或者至少代码更干净。

我会在调用函数之前检查函数是否存在:

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); }
    }
}
这取决于您可能调用这些回调的次数。如果到处都是,那么您的方式可能会更好,或者至少代码更干净。

需要注意的几点

  • options.onSuccess=options.onSuccess | | function(){}正在检查成员是否存在,而不是检查其函数

    您可能需要
    options.onSuccess=(typeof options.onSuccess=“function”)?options.onSuccess:函数(){}

  • 这同样适用于
    onError

  • 作为轻微的优化,您可以将空函数指向相同的函数;而不是可能重复两次。如果使用jQuery,jQuery定义:

  • 在回调是异步的情况下,您将对
    选项保持开放状态。onSuccess
    选项。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;
    
    执行回调时,
    success
    error
    将未定义

  • 需要注意的几件事

  • options.onSuccess=options.onSuccess | | function(){}正在检查成员是否存在,而不是检查其函数

    您可能需要
    options.onSuccess=(typeof options.onSuccess=“function”)?options.onSuccess:函数(){}

  • 这同样适用于
    onError

  • 作为轻微的优化,您可以将空函数指向相同的函数;而不是可能重复两次。如果使用jQuery,jQuery定义:

  • 在回调是异步的情况下,您将对
    选项保持开放状态。onSuccess
    选项。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;
    
    执行回调时,
    success
    error
    将未定义


  • 我觉得你在这里做的很好。就最佳实践而言,您希望了解哪些方面?另一种方法是使用
    error
    作为第一个传递的参数的单个回调,当没有发生错误时,该参数为null。我看到的一个问题是,您没有检查onSuccess和onError(您在那里有一个输入错误)是否有函数。我想补充一点,我觉得你在这里做的很好。就最佳实践而言,您希望了解哪些方面?另一种方法是使用
    error
    作为第一个传递的参数的单个回调,当没有发生错误时,该参数为null。我看到的一个问题是,您没有检查onSuccess和onError(您在那里有一个输入错误)是否有函数。我想补充一下。非常感谢!我想您想了解的详细信息取决于这是一个公共API还是仅在内部使用。在我的情况下,这只是内部的,所以我知道功能将是功能等。非常感谢!我想您想了解的详细信息取决于这是一个公共API还是仅在内部使用。在我的情况下,它只是内部的,所以我知道函数将是函数等等。对于我的情况,我认为这个答案是最合适的:)对于我的情况,我认为这个答案是最合适的:)