2010-10-28 2 views
0

У меня есть медленная функция, которая делает запрос AJAX:Javascript: вызов определенной функции на функцию полного

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.

ответ

4

Вы объявляете свою функцию X следующим образом :

function X(param1,param2,callback){ 

... использовать функцию обратного вызова, как это:

success: function(msg){ 
    callback(); 
} 

... и называть X так:

X('a', 'b', function(){alert('hi');}); 

Это работает, потому что ваш обработчик успеха - это закрытие над данными в пределах вашей функции X, включая ее аргументы. Он имеет живую ссылку на эту информацию (даже после того, как возвращается X), и так позже, когда вызов Ajax завершается, он все равно может использовать аргумент callback. Подробнее о закрытиях здесь: Closures are not complicated

+0

Легенда, которая должна работать. Я не был уверен в синтаксисе. Большое спасибо, – Eamorr

0
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}) 
+0

Привет, спасибо за ответ. T.J. Кроудер, выше, придумал хороший способ позвонить Х, в полной мере используя анонимные функции. – Eamorr

+0

@ Eamorr мой код точно такой же, разница только в том, что 'callback' назван' f 'в моем коде :) – joni

Смежные вопросы