Функция обратного вызова с необязательным вторым параметром - PullRequest
0 голосов
/ 07 октября 2018

У меня есть две функции, которые я отправляю как функцию обратного вызова в метод mapFunction.

Проблема в том, что метод mapFunction возвращает обратный вызов только с одним параметром, объявленным внутри функции, и в обоих обратных вызовах он должен быть первым.

func1(param) {...}
func2(param1, param2) {...}

mapFunction(list, callback) {
 //....
 const something = 'blabla';
 // if callback has second param run callback(something, secondParam)
 return callback(something) 
}

mapFunction(list, func1);
mapFunction(list, func2); // send second param

** КакЯ отправляю второй параметр с функцией обратного вызова и функцию вызова с двумя параметрами, если два существуют, если не вызывать только с одним определителем внутри области действия mapFunction.Является ли это возможным ?**

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

JavaScript позволяет передавать в функцию больше аргументов, чем заявлено в ее определении.Таким образом, вы всегда можете передать два параметра вашему обратному вызову и просто проигнорировать второй параметр в func1

0 голосов
/ 08 октября 2018

Если я правильно понимаю, этот код поможет вам.Первое из значений, которое должно быть передано в функцию 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 objects или array в mapFunc как только один параметр.

0 голосов
/ 07 октября 2018

Вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...