JQuery: проблемы с передачей функции в качестве параметра

Я создал общую функцию, которая получает данные с сервера через вызов JQuery AJAX. Когда вы успешно извлекаете данные, я бы хотел вызвать другую функцию, которую я передаю (например, functionAfterSuccess в примере ниже).

Это передается в функции, вызывается, но, похоже, выполняется сразу, а не "ждет" до успешного извлечения данных с сервера.

Выполняется ли переданная функция (functionAfterSuccess) одновременно с основной функцией (genericAJAXGet)? Не уверен, что я делаю неправильно.

// calling function
$('#run').on('click' , function() {

 var $url = '/getdata';
 var $dataToSend = { id: '123', data: 'ABC' };

 genericAJAXGet("POST", $url, $dataToSend, "json", myFunction($param1));

});

// generic AJAX function
function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess) {

 // build ajax request
 var $request = $.ajax({
 type: $type,
 url: $url,
 data: $dataToSend,
 dataType: $returnDataType
 });

 // Process a successful response
 $request.done(function(data) {

 if(data.error) {

 alert('uh oh');

 } else {

 // successfully returned data, but there was some application logic
 if (data["type"] == "issue") {

 alert('app logic issue');

 } else {

 // only run the passed in function when the data is successfully retrieved
 functionAfterSuccess;
 }
 }

 });

 // Process a failed response
 $request.fail(function() {
 alert('request failure');

 });
}

// Other function to be called that is being passed in as a parameter
function myFunction($param1) {

 alert($param1);

}
1 ответ

Возможно, вы, вероятно, говорите, потому что никогда не показывали, как вы называете главную функцию), не передавая функцию, но возвращаемое значение функции:

genericAJAXGet($type, $url, $dataToSend, $returnDataType, myFunction()) {

Вместо этого это должно быть:

genericAJAXGet($type, $url, $dataToSend, $returnDataType, myFunction) { // <--- no parentheses

И затем, в своем коде, назовите его так:

} else {

 // only run the passed in function when the data is successfully retrieved
 functionAfterSuccess(); // parentheses needed here to actually call it
 }

Кроме того, вы, вероятно, хотите проверить, существует ли функция functionAfterSuccess и является функцией.

ОБНОВИТЬ

Если вы хотите отправить параметры функции обратного вызова, вы можете добавить еще один параметр к главному вызову:

genericAJAXGet("POST", $url, $dataToSend, "json", myFunction, $param1);

Затем измените его определение на:

function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess, functionParam) {
... 
}

И, наконец, вызвать его изнутри функции:

} else {

 // only run the passed in function when the data is successfully retrieved
 functionAfterSuccess(functionParam); // now the parameter is inside the parentheses
 }

Чтобы сделать его более ясным, это функция с соответствующими изменениями внутри:

function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess, functionParam) {
 ... 
 } else {

 // only run the passed in function when the data is successfully retrieved
 functionAfterSuccess(functionParam); // now the parameter is inside the parentheses
 }
 ...
}

И так вы называете это (с аргументами из вашего примера):

var $url = '/getdata';
var $dataToSend = { id: '123', data: 'ABC' };
myFunction = function(p) {
 alert(p);
}
var $param1 = 'Hey there!';
genericAJAXGet("POST", $url, $dataToSend, "json", myFunction, $param1);

licensed under cc by-sa 3.0 with attribution.