2010-01-04 32 views
13

Buna benzer bir şey istiyorum.javascript geri arama işlevi ve parametreleri

function AjaxService() 
{ 

this.Remove = function (id, call_back) 
{ 
    myWebService.Remove(id, CallBack) 
} 

function CallBack(res) { 
     call_back(res); 
    } 
} 

yani benim çağıran programı Ayrıca ben bunu başarmak nasıl başarı işlevine daha fazla parametre eklemek istiyorsanız bu

var xx = new AjaxService(); 
xx.Remove(1,success); 

function success(res) 
{ 


} 

gibi olacak. ben bu

var xx = new AjaxService(); 
//how to call back success function with these parameters 
//xx.Remove(1,success(22,33)); 

function success(res,val1, val2) 
{ 


} 

Yardım gibi başarı işlevi appretiated edilecektir varsa söyleyin. Selamlar Parminder

cevap

22

kullanın kapatma ve fonksiyon fabrika

:

function generateSuccess (var1,var2) { 
    return function (res) { 
     // use res, var1 and var2 in here 
    } 
} 
xx.Remove(1,generateSuccess(val1,val2)); 

Burada ne geçiyoruz değil generateSuccess işlevi ancak generateSuccess tarafından döndürülen anonim işlevtarafından beklenen geri bildirime benziyor. val1 ve val2, generateSuccess'a geçirilir ve döndürülen anonim işlevde bir kapatma ile yakalanır.

daha net olmak gerekirse, bu şey bu:

function generateSuccess (var1,var2) { 
    return function (res) { 
     // use res, var1 and var2 in here 
    } 
} 
var success = generateSuccess(val1,val2); 
xx.Remove(1,success); 

Yoksa satır içi yapmayı tercih edin:

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

olarak okunabilir değil ama fabrika işlevini adlandırma kurtarır. Bunu bir döngü içinde yapmazsanız, Xinus'un çözümü aynı zamanda inline versiyonumdan da iyi ve basit olurdu. Ancak, bir döngüde, geçerli kapsamdaki değişkenden geri arama işlevine iletilen değişkeni ayırmak için çift kapatma mekanizmasına ihtiyacınız olduğunu unutmayın. Bunu yapmak için

+2

javascript bunu az karmaşık yollar vardır değil mi ? – jrharshath

+0

çalışmadı – Parminder

+0

@parminder İşe yaramayacağından emin misiniz? Bu, argümanları argüman kabul etmeyen geri aramalara iletmenin standart yoludur, örneğin argümanları "setTimeout" 'a aktarma. Sözdiziminden kaçırmış olabileceğiniz bir şey var mı? – slebetman

8

Bunu geçebilir olarak anonim işlev işaretçisi

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

olmalıdır: 'xx.Remove (1, function (res) {başarısı (res, val1, val2)});' – slebetman

0

tek yön:

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

Yani bunun gibi kullanabilirsiniz:

var service = new AjaxService(); 
service.Remove(1,success, [22,33]); 

function success(res,val1, val2) 
{ 
    alert("result = "+res); 
    alert("values are "+val1+" and "+val2); 
} 

Genellikle geri arama bir setTimeout kullanarak yürütmek var. Bu şekilde, geri çekilme zamanınız geldiğinde yürütülür. Kodunuz bu arada devam etmeye devam edecektir, örneğin: #

var service = new AjaxService(); 
service.remove(1, function(){ alert('done'); }); // alert#1 
alert('called service.remove'); // alert#2 

# 2 numaralı alarmdan sonra geri arama işleminiz gerçekleştirilecektir.

Elbette, uygulamanız durumunda, ajax geri bildiriminin kendisi eşzamansız olduğundan otomatik olarak gerçekleşecektir. Yani uygulamanızda, bunu yapmamanız daha iyi oldu.

Şerefe!
JRH

+0

CallBack fonksiyon referansında call_back yoktur nasıl çağrılacak. – Parminder

+1

JS, bu gibi kalıpları kullanma eğiliminde değildir; genellikle başka herhangi bir durum bir kapağa sarılır. –

İlgili konular