2012-10-22 8 views
13

के साथ जावास्क्रिप्ट कॉलबैक फ़ंक्शन यह प्रश्न डुप्लिकेट जैसा दिखता है, क्योंकि शीर्षक लगभग दोहराया गया है। लेकिन, मेरी समस्या सरल लगती है और मुझे इसका जवाब नहीं मिल रहा है।पैरामीटर

मैं एक जावास्क्रिप्ट समारोह एक और कॉलबैक फ़ंक्शन निष्पादित करता है, यह इस तरह काम करता है:

<script type='text/javascript'> 
firstfunction(callbackfunction); 
</script> 

जहां कॉलबैक समारोह के रूप में परिभाषित किया गया है:

callbackfunction(response) { 
    if (response=='loggedin'){ 
    // ... do stuff 
}} 

लेकिन मैं इसे कुछ इस तरह होना चाहते हैं :

callbackfunction(response, param) { 
    if (response=='loggedin'){ 
    // ... do stuff with param 
}} 

मेरा प्रश्न है, क्या यह इस तरह के पैरामीटर को पारित करने के लिए काम करता है:

<script type='text/javascript'> 
firstfunction(callbackfunction(param)); 
</script> 

या क्या मैं इसे गलत कर रहा हूं?

उत्तर

24

अपने सवाल का सीधा जवाब में, यह काम नहीं करता है:

firstfunction(callbackfunction(param)); 

जो तुरंत callbackfunction निष्पादित करेगा और पास करेगा इसे firstfunction पर तर्क के रूप में निष्पादित करने से वापसी मान जो आप चाहते हैं कि संभावना नहीं है।


यह अपने प्रश्न से स्पष्ट नहीं है कि तुम सिर्फ firstfunction() बदल जब यह कॉलबैक कॉल या कि क्या आप एक गुमनाम समारोह तर्क के साथ कॉलबैक फ़ंक्शन को कॉल करना चाहिए callbackfunction() को दो पैरामीटर पारित करने के लिए करना चाहिए।

इन दो विकल्पों में इस प्रकार दिखाई देगा:

function firstfunction(callback) { 
    // code here 
    callback(arg1, arg2); 
} 

firstfunction(callbackfunction); 

या

function firstfunction(callback) { 
    // code here 
    callback(); 
} 

firstfunction(function() { 
    callbackfunction(xxx, yyy); 
}); 
+0

सवाल सीधे जवाब देने के लिए धन्यवाद! मुझे पूरा यकीन है कि मैं काम करने के लिए इन तरीकों में से एक प्राप्त कर पाऊंगा। – rofls

1

function कुंजी शब्द है, आप इसे फ़ंक्शन नाम के रूप में उपयोग नहीं कर सकते हैं।

माना कि अपने कार्य नाम foo है, तो आप नीचे की तरह कर सकता है:

var param = 'what ever'; 
foo(function(response) { 
    callbackfunction(response, param); 
}); 
7

उपयोग एक गुमनाम समारोह:

function foo(callback) { 
    callback(); 
} 

function baz(param) { 
    console.log(param); 
} 

foo(function(){ baz('param') }); 
2

जब एक समारोह बुला पैरामीटर जोड़ने से। https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

xdaz पहले से ही सरल संस्करण का उत्तर दिया है। यहां पैरामीटर की परिवर्तनीय मात्रा के साथ एक उदाहरण है।

function someObject(){ 
     this.callbacks=new Array(); 
     this.addCallback=function(cb){ 
      this.callbacks[this.callbacks.length]=cb 
     } 
     this.callCallbacks=function(){ 
      //var arr=arguments; this does not seem to work 
      //arr[arr.length]="param2"; 
      var arr = new Array(); 
      for(i in arguments){ 
       arr[i]=arguments[i]; 
      } 
      arr[arr.length]="another param"; 
      i=0; 
      for(i in this.callbacks){ 
       this.callbacks[i].apply(null,arr); 
       //this.callbacks[i].apply(this,arr); 
       //this is a ref to currrent object 
      } 
     } 
     this.callCallbacksSimple=function(arg){ 
      for(i in this.callbacks){ 
       this.callbacks[i](arg,"simple parameter"); 
      } 

     } 
} 
function callbackFunction(){ 
    for(i in arguments){ 
     console.log("Received argument: " + arguments[i]); 
    } 
} 
var ObjectInstance=new someObject(); 
ObjectInstance.addCallback(callbackFunction); 
ObjectInstance.callCallbacks("call callbacks"); 
ObjectInstance.callCallbacksSimple("call callbacks"); 
1

मुझे लगता है कि यह आपके लिए क्या देख रहे है।

आइए कहें कि आप कुछ करने के लिए jQuery AJAX का उपयोग कर रहे हैं, और आप इसे कॉलबैक नामित कर रहे हैं। यहां हमारे पास एक ऑनर कॉलबैक है जिसका उपयोग आप अपने एप्लिकेशन में त्रुटियों को लॉग या संभालने के लिए कर सकते हैं।यह jQuery अजाक्स त्रुटि कॉलबैक हस्ताक्षर के अनुरूप है, एक अतिरिक्त पैरामीटर है कि आप वापस

function onError(jqXHR, textStatus, errorThrown, yourOwnVariableThing) { 
    console.error('Something went wrong with ' + yourOwnVariableThing); 
} 

इस जहाँ आपके समारोह के नाम से जाना जाता है पर जोड़ना चाहते थे हो सकता है के लिए छोड़कर - लेकिन आप एक अतिरिक्त पैरामीटर चाहते

$.ajax("/api/getSomeData/") 
.done(onDone) 
.fail(onError) 
.always(onComplete); 

तो यह आप जावास्क्रिप्ट में अतिरिक्त पैरामीटर

$.ajax("/api/getSomeData/") 
    .done(onDone) 
    .fail(onError.bind(this, arguments[0], arguments[1], arguments[2], 'Moo Moo'); 
    .always(onComplete); 

arguments है एक सरणी जोड़ने के लिए होता है कि सभी argume क्या कर सकते हैं एनटीएस एक समारोह में पास हो गया, और इसलिए आप कॉलबैक के साथ बस उन तर्कों को पार कर रहे हैं।

Arguments

Bind