2010-01-04 19 views
13

मैं इस तरह कुछ करना चाहता हूं।जावास्क्रिप्ट कॉलबैक फ़ंक्शन और पैरामीटर

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


} 

सहायता सफलता समारोह appretiated किया जाएगा।

सादर परमिंदर

उत्तर

22

एक बंद करने और एक समारोह कारखाने का उपयोग करें:

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

क्या तुम यहाँ से गुजर रहे हैं नहीं है generateSuccess फ़ंक्शन लेकिन अज्ञात फ़ंक्शन generateSuccess द्वारा लौटाया गया जोद्वारा अपेक्षित कॉलबैक की तरह दिखता है। val1 और val2generateSuccess में पारित किए गए हैं और लौटाए गए अज्ञात फ़ंक्शन में बंद होने पर कब्जा कर लिया गया है।

अधिक स्पष्ट रूप से, यह है कि क्या हो रहा है:

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 का समाधान भी मेरे इनलाइन संस्करण से ठीक और सरल होगा। लेकिन ध्यान रखें कि एक लूप में आपको मौजूदा दायरे में चर से कॉलबैक फ़ंक्शन में पारित चर को डिस्कनेक्ट करने के लिए डबल क्लोजर तंत्र की आवश्यकता होती है।

+2

जावास्क्रिप्ट में यह करने के लिए कम जटिल तरीके हैं, देखते हैं न आप क्या सोचते हैं ? – jrharshath

+0

काम नहीं किया वैसे भी – Parminder

+0

@ पार्मिंडर क्या आप वाकई काम नहीं करते हैं? कॉलबैक के लिए तर्क पारित करने का यह मानक तरीका है जो तर्क स्वीकार नहीं करता है, उदाहरण के लिए 'setTimeout' पर तर्क गुजर रहा है। क्या ऐसा कुछ है जिसे आपने वाक्यविन्यास के रूप में याद किया हो सकता है? – slebetman

8

आप इसे पारित कर सकते हैं के रूप में अज्ञात फ़ंक्शन सूचक

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

होना चाहिए: 'xx.Remove (1, समारोह (रेस) {सफलता (रेस, VAL1, val2)});' – slebetman

0

एक तरह से यह करने के लिए:

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

+0

है यह कैसे कहा जाएगा। – Parminder

+1

जेएस इस तरह के पैटर्न का उपयोग नहीं करता है; आमतौर पर किसी भी अन्य राज्य को बंद करने में लपेटा जाता है। –

संबंधित मुद्दे