带有可选第二个参数的回调函数

时间:2018-10-07 14:08:13

标签: javascript callback

我有两个函数,它们作为回调函数发送到mapFunction方法。

问题在于mapFunction方法返回的回调仅在函数内部声明了一个参数,而在两个回调中,它必须是第一个。

{"name":"MALFORMED_REQUEST","message":"Incoming JSON request does not map to API request","information_link":"https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST","debug_id":"815ed32bcd78e"}

**如果存在两个,如何使用回调函数发送第二个参数,并使用两个参数调用函数,如果不存在,则仅使用mapFunction范围内的一个定义器进行调用。可能吗 ? **

3 个答案:

答案 0 :(得分:0)

您可以使用Function.length

function func1(param) { alert(param); }
function func2(param1, param2) { alert(param1 + ' ' + param2); }

function mapFunction(list, callback) {
 const something = 'blabla';
 console.log(callback.length);
 
 return callback.length == 2 ? callback(something, list) : callback(something);
}

let list = 'secondParam';
mapFunction(list, func1);
mapFunction(list, func2);

答案 1 :(得分:0)

JavaScript使您可以向函数传递比其定义中声明的参数更多的参数。因此,您始终可以将两个参数传递给回调函数,而只需忽略func1

中的第二个参数

答案 2 :(得分:0)

如果我正确理解,此代码将为您提供帮助。必须传递给函数1-3的第一个值在它们之间是通用的,它们将从mapFunction传递,但是其他参数将从何处提供?如果您在调用mapFunc时需要传递它们,则可以尝试这种时尚的方法,该方法可以与任何其他函数和任意数量的参数(func4,...)配合使用:

    function func1(p1) { console.log(p1);  } 
    function func2(p1, p2) { console.log(p1 + ", " + p2); } 
    function func3(p1, p2, p3) { console.log(p1 + ", " + p2 + ", " + p3); } 
    function mapFunction(list, callback) {
        const something = 'insideValue';
        return callback.apply(callback, [something].concat(Array.apply(null, arguments).slice(2, 1+callback.length)));// you can remove 1+callback.length and pass all parameters to callback but ignore extra parameters there (in func1-3).
    }
    var list=["any thing ..."];
    mapFunction(list, func1); 
    mapFunction(list, func2, "param2val");
    mapFunction(list, func3, "param2val", "p3val");

您还可以将它们作为simple objectsarray的形式仅作为一个参数传递给mapFunc。