Я хочу что-то подобное этому.
function AjaxService()
{
this.Remove = function (id, call_back)
{
myWebService.Remove(id, CallBack)
}
function CallBack(res) {
call_back(res);
}
}
поэтому моя вызывающая программа будет такой
var xx = new AjaxService();
xx.Remove(1,success);
function success(res)
{
}
Также, если я хочу добавить дополнительные параметры в функцию успеха, как я ее получу.
Скажем, если у меня есть функция успеха, такая как
var xx = new AjaxService();
//how to call back success function with these parameters
//xx.Remove(1,success(22,33));
function success(res,val1, val2)
{
}
Справка будет рассмотрена.
Отношения
Parminder
Ответ 1
Используйте закрытие и функцию factory:
function generateSuccess (var1,var2) {
return function (res) {
// use res, var1 and var2 in here
}
}
xx.Remove(1,generateSuccess(val1,val2));
То, что вы передаете здесь, это не функция generateSuccess
, а анонимная функция, возвращаемая generateSuccess
, которая выглядит как обратный вызов, ожидаемый Remove
. val1
и val2
передаются в generateSuccess
и захватываются замыканием в возвращенной анонимной функции.
Чтобы быть более ясным, вот что происходит:
function generateSuccess (var1,var2) {
return function (res) {
// use res, var1 and var2 in here
}
}
var success = generateSuccess(val1,val2);
xx.Remove(1,success);
Или, если вы предпочитаете делать это inline:
xx.Remove(1,(function(var1,var2) {
return function (res) {
// this is your success function
}
})(val1,val2));
не читается, а сохраняет имя функции factory. Если вы не делаете этого в цикле, то решение Xinus также будет прекрасным и простым, чем моя встроенная версия. Но имейте в виду, что в цикле вам нужен механизм двойного закрытия, чтобы отключить переменную, переданную в функцию обратного вызова, из переменной в текущей области.
Ответ 2
Вы можете передать его как указатель анонимной функции
xx.Remove(1,function(){
//function call will go here
success(res,val1, val2);
});
Ответ 3
один из способов сделать это:
function AjaxService {
var args_to_cb = [];
this.Remove = function (id, call_back, args_to_callback_as_array) {
if( args_to_callback_as_array!=undefined )
args_to_cb = args_to_callback_as_array;
else
args_to_cb = [];
myWebService.Remove(id, CallBack)
}
function CallBack(res) {
setTimeout( function(){ call_back(res, args_to_cb); }, 0 );
}
}
Итак, вы можете использовать его следующим образом:
var service = new AjaxService();
service.Remove(1,success, [22,33]);
function success(res,val1, val2)
{
alert("result = "+res);
alert("values are "+val1+" and "+val2);
}
Обычно я выполняю обратный вызов с помощью setTimeout
. Таким образом, ваш обратный вызов будет выполняться, когда на это наступит время. Ваш код будет продолжать выполнять пока что, например:
var service = new AjaxService();
service.remove(1, function(){ alert('done'); }); // alert#1
alert('called service.remove'); // alert#2
Ваш ответ будет выполнен после предупреждения №2.
Конечно, в случае вашего приложения это произойдет автоматически, так как сам обратный вызов ajax является асинхронным. Поэтому в вашем приложении вам лучше не делать этого.
Ура!
JRH