Функция обратного вызова javascript и параметры

Я хочу что-то похожее на это.

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)
{


}

Помощь будет оценена.

С уважением Парминдер

3 ответа

Решение

Используйте замыкание и фабрику функций:

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);

Или, если вы предпочитаете делать это в строке:

xx.Remove(1,(function(var1,var2) {
    return function (res) {
        // this is your success function
    }
})(val1,val2));

не так удобочитаемо, но избавляет вас от присвоения заводской функции именам. Если вы не делаете это в цикле, то решение Xinus также будет лучше и проще, чем моя встроенная версия. Но учтите, что в цикле вам нужен механизм двойного замыкания, чтобы отключить переменную, переданную в функцию обратного вызова, от переменной в текущей области видимости.

Вы можете передать его как указатель на анонимную функцию

xx.Remove(1,function(){
                           //function call will go here
                           success(res,val1, val2);
                      });

Один из способов сделать это:

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

Другие вопросы по тегам