Javascript: вызов определенной функции при завершении функции
У меня медленная функция, которая делает запрос AJAX:
function X(param1,param2){
var params={
type: "POST",
url: "./ajax/useful.php",
data: "param1="+param1+"¶m2="+param2,
success: function(msg){
//do something
}
};
var result=$.ajax(params).responseText;
}
Все отлично работает, когда я звоню X("asdf","qwerty").
Теперь я хочу уметь вызывать функцию X следующим образом:
function X(param1,param2,function(){alert('hi');}){
var params={
type: "POST",
url: "./ajax/useful.php",
data: "param1="+param1+"¶m2="+param2,
success: function(msg){
/////
//I want to be able call the function in the 3rd parameter (alert in this case)
/////
}
};
var result=$.ajax(params).responseText;
}
Теперь вы можете сказать, почему бы мне просто не вызвать оповещение ("привет") прямо внутри успеха. Конечно, я могу это сделать, но я хочу иметь возможность изменять то, что происходит внутри вызываемой функции (а не просто предупреждение ("привет")), в зависимости от того, кто вызывает X.
2 ответа
Вы объявляете X
функционировать так:
function X(param1,param2,callback){
... использовать обратный вызов, как это:
success: function(msg){
callback();
}
... и позвонить X
как это:
X('a', 'b', function(){alert('hi');});
Это работает, потому что ваш обработчик успеха является закрытием данных внутри вашего X
функция, включая ее аргументы. Он имеет прямую ссылку на эту информацию (даже после X
возвращается), и поэтому позже, когда вызов Ajax завершится, он все еще может использовать callback
аргумент. Подробнее о замыканиях здесь: замыкания не сложны
function X(param1,param2,f){
var params={
type: "POST",
url: "./ajax/useful.php",
data: "param1="+param1+"¶m2="+param2,
success: function(msg){
f();
}
};
var result=$.ajax(params).responseText;
}
должно сработать. Вы не можете позвонить X, как это:
X(param1,param2,function(){dowhatever})