Javascript: вызов определенной функции при завершении функции

У меня медленная функция, которая делает запрос AJAX:

function X(param1,param2){
var params={
    type: "POST",
    url: "./ajax/useful.php",
    data: "param1="+param1+"&param2="+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+"&param2="+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+"&param2="+param2,
    success: function(msg){
      f();
    }
  };
  var result=$.ajax(params).responseText;
}

должно сработать. Вы не можете позвонить X, как это:

X(param1,param2,function(){dowhatever})
Другие вопросы по тегам