Общее решение
Помощник создателя обратного вызова
Я создал общего создателя обратного вызова вдоль Создание замыканий в циклах: распространенная ошибка , что Anurag указал в своем ответе .
Параметры создателя обратного вызова
- Первым параметром функции является обратный вызов.
- Каждый другой параметр будет передан в этот обратный вызов в качестве параметров.
Параметры пройденного обратного вызова
- Первая часть параметров происходит от аргументов, которые вы передали помощнику создателя обратного вызова (после первого параметра, как я описал ранее).
- Вторая часть основана на аргументах, которые будут напрямую переданы обратному вызову вызывающей стороной.
Исходный код
//Creates an anonymus function that will call the first parameter of
//this callbackCreator function (the passed callback)
//whose arguments will be this callbackCreator function's remaining parameters
//followed by the arguments passed to the anonymus function
//(the returned callback).
function callbackCreator() {
var functionToCall = arguments[0];
var argumentsOfFunctionToCall = Array.prototype.slice.apply(arguments, [1]);
return function () {
var argumentsOfCallback = Array.prototype.slice.apply(arguments, [0]);
functionToCall.apply(this, argumentsOfFunctionToCall.concat(argumentsOfCallback));
}
}
Пример использования
Вот пользовательский объект конфигурации AJAX, для успешного обратного вызова которого используется мой помощник создателя обратного вызова. С помощью текста ответа функция обратного вызова обновляет первую ячейку строки в таблице DataTables на основе строки, в которой произошло действие, и печатает сообщение.
{
url: 'example.com/data/' + elementId + '/generate-id',
method: 'POST',
successHandler: callbackCreator(function (row, message, response) {//Callback parameters: Values we want to pass followed with the arguments passed through successHandler.
table.cell(row, 0).data(JSON.parse(response).text);
console.log(message);
},
$(this).parents('tr'),//Row value we want to pass for the callback.
actionName + ' was successful'//Message value we want to pass for the callback.
)
}
Или в вашем случае:
arr[c.name] = callbackCreator(function(url) {
callback(url);
},
c.url
);