2010-01-04 40 views
13

Tôi muốn một cái gì đó tương tự như thế này.chức năng gọi lại javascript và tham số

function AjaxService() 
{ 

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

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

vì vậy chương trình gọi điện thoại của tôi sẽ như thế này

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

function success(res) 
{ 


} 

Ngoài ra nếu tôi muốn bổ sung thêm tham số cho hàm thành công như thế nào tôi sẽ đạt được nó. Nói Nếu tôi có chức năng thành công như thế này

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

function success(res,val1, val2) 
{ 


} 

Trợ giúp sẽ được appretiated.

Trân Parminder

Trả lời

22

Sử dụng một đóng cửa và một nhà máy chức năng:

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

gì bạn đang đi qua đây không phải là Hàm generateSuccess nhưng hàm ẩn danh được trả về generateSuccess trông giống như gọi lại được mong đợi bởi Remove. val1val2 được chuyển vào generateSuccess và được chụp bằng cách đóng trong hàm ẩn danh được trả về.

Để được rõ ràng hơn, đây là những gì đang xảy ra:

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

Hoặc nếu bạn thích để làm điều đó inline:

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

không phải là có thể đọc được nhưng giúp bạn tiết kiệm từ đặt tên cho các chức năng nhà máy. Nếu bạn không làm điều này trong một vòng lặp thì giải pháp của Xinus cũng sẽ tốt và đơn giản hơn phiên bản nội tuyến của tôi. Nhưng lưu ý rằng trong một vòng lặp, bạn cần cơ chế đóng kép để ngắt kết nối biến được chuyển vào hàm gọi lại từ biến trong phạm vi hiện tại.

+2

có ít cách phức tạp hơn để làm điều này trong javascript, bạn không nghĩ ? – jrharshath

+0

didnt work thanks anyway – Parminder

+0

@parminder Bạn có chắc nó không hoạt động? Đây là cách tiêu chuẩn để chuyển đối số cho các cuộc gọi lại không chấp nhận các đối số, ví dụ như chuyển các đối số tới 'setTimeout'. Có cái gì bạn có thể đã bỏ lỡ hình thức cú pháp? – slebetman

8

Bạn có thể vượt qua nó như vô danh con trỏ hàm

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

nên là: 'xx.Remove (1, function (res) {success (res, val1, val2)}); ' – slebetman

0

một cách để làm điều này:

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

Vì vậy, bạn có thể sử dụng nó như thế này:

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

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

Tôi thường có gọi lại thực hiện bằng cách sử dụng setTimeout. Bằng cách này, gọi lại của bạn sẽ thực hiện khi nó được thời gian để làm như vậy. Mã của bạn sẽ tiếp tục thực hiện trong khi đó, ví dụ:

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

Gọi lại của bạn sẽ thực hiện sau khi cảnh báo # 2.

Tất nhiên, trong trường hợp ứng dụng của bạn, nó sẽ tự động xảy ra vì chính cuộc gọi lại ajax không đồng bộ. Vì vậy, trong ứng dụng của bạn, bạn đã tốt hơn không làm điều này.

Chúc mừng!
jrh

+0

trong tham chiếu hàm CallBack với call_back không tồn tại cách thức gọi nó. – Parminder

+1

JS có xu hướng không sử dụng các mẫu như thế này; thường bất kỳ trạng thái nào khác được bao bọc trong một bao đóng. –

Các vấn đề liên quan