2010-08-11 19 views
215

पर पैरामीटर पास करना मैं कॉलबैक के रूप में उपयोग किए गए फ़ंक्शन में कुछ पैरामीटर पास करने का प्रयास कर रहा हूं, मैं यह कैसे कर सकता हूं?जावास्क्रिप्ट: कॉलबैक फ़ंक्शन

function tryMe (param1, param2) { 
    alert (param1 + " and " + param2); 
} 

function callbackTester (callback, param1, param2) { 
    callback (param1, param2); 
} 

callbackTester (tryMe, "hello", "goodbye"); 
+7

क्या आप काम करना चाहिए कर रहे हैं। आपके पास क्या समस्याएं हैं? –

+1

आपका कोड ठीक काम करता है, समस्या क्या है? – Sarfraz

+1

यह काम करना चाहिए ... http://jsfiddle.net/QXQZj/ – Hristo

उत्तर

186

आप थोड़ा और अधिक सामान्य कुछ, आप चर की तरह तो तर्कों का उपयोग कर सकते हैं: ठीक

function tryMe (param1, param2) { 
    alert(param1 + " and " + param2); 
} 

function callbackTester (callback) { 
    callback (arguments[1], arguments[2]); 
} 

callbackTester (tryMe, "hello", "goodbye"); 

लेकिन अन्यथा, अपने उदाहरण से काम करता है (तर्क [0] कॉलबैक के स्थान पर इस्तेमाल किया जा सकता परीक्षक में)

+42

जब तक हम सामान्य होने की भावना में हैं, 'callbackTapp'' के लिए फ़ंक्शन बॉडी के रूप में 'callback.apply (arguments)' दो तर्क परिदृश्य से परे एक्स्टेंसिबल है। –

+0

क्षमा करें, यह मुख्य कोड में एक वाक्यविन्यास त्रुटि थी, मैंने सोचा था क्योंकि यह पहली बार है जब मैं जावास्क्रिप्ट में कॉलबैक का उपयोग करता हूं, आपने मुझे यह समझने में मदद की है कि यह प्रबलता नहीं है, और एक महान उदाहरण देखने के लिए – vitto

+1

एफवाईआई, एक अनाम फ़ंक्शन (मारिमुथू का उत्तर) या .bind() (एंडी का उत्तर) कॉलबैक में तर्क पारित करने के लिए बहुत साफ तरीके हैं। – antoine

50

आपका प्रश्न अस्पष्ट है। यदि आप पूछ रहे हैं कि आप इसे सरल तरीके से कैसे कर सकते हैं, तो आपको ईसीएमएस्क्रिप्ट 5 वें संस्करण विधि .bind() पर एक नज़र डालना चाहिए, जो फ़ंक्शन.प्रोटोटाइप का सदस्य है। यह उपयोग करके, आप कुछ इस तरह कर सकते हैं:

function tryMe (param1, param2) { 
    alert (param1 + " and " + param2); 
} 

function callbackTester (callback) { 
    callback(); 
} 

callbackTester(tryMe.bind(null, "hello", "goodbye")); 

आप निम्न कोड है, जो विधि कहते हैं अगर यह मौजूदा ब्राउज़र में उपलब्ध नहीं है का उपयोग कर सकते हैं:

// From Prototype.js 
if (!Function.prototype.bind) { // check if native implementation available 
    Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments), 
     object = args.shift(); 
    return function(){ 
     return fn.apply(object, 
     args.concat(Array.prototype.slice.call(arguments))); 
    }; 
    }; 
} 

Example

bind() - PrototypeJS Documentation

+0

ब्याज से, 'Array.prototype.slice.call (तर्क)' और 'arguments.slice()' के बीच क्या अंतर है? – sje397

+6

@ sje397: * तर्क * एक \ * असली \ * सरणी नहीं है, इसलिए इसमें * स्लाइस() * विधि नहीं है। हालांकि, * Array.prototype * पर * स्लाइस() * विधि जानबूझकर सामान्य है, इसलिए आप किसी ऑब्जेक्ट को पास कर सकते हैं जिसमें संख्यात्मक अनुक्रमणिका और * लंबाई * संपत्ति है और यह काम करेगा। –

+0

आह। चीयर्स .... – sje397

176

यह भी काम करेगा:

// callback function 
function tryMe (param1, param2) { 
    alert (param1 + " and " + param2); 
} 

// callback executer 
function callbackTester (callback) { 
    callback(); 
} 

// test function 
callbackTester (function() { 
    tryMe("hello", "goodbye"); 
}); 

एक और परिदृश्य:

// callback function 
function tryMe (param1, param2, param3) { 
    alert (param1 + " and " + param2 + " " + param3); 
} 

// callback executer 
function callbackTester (callback) { 
//this is the more obivous scenario as we use callback function 
//only when we have some missing value 
//get this data from ajax or compute 
var extraParam = "this data was missing" ; 

//call the callback when we have the data 
    callback(extraParam); 
} 

// test function 
callbackTester (function(k) { 
    tryMe("hello", "goodbye", k); 
}); 
+21

+1। बंद/अज्ञात कार्यों में गुजरना सबसे अच्छा तरीका है। –

+0

फिर आप अंतराल को कैसे साफ़ करेंगे? –

+2

यह बहुत अच्छा काम करता है क्योंकि यह अज्ञात फ़ंक्शन को पैरामीटर में पास करने की अनुमति देता है: कॉलबैकटेस्टर (फ़ंक्शन (डेटा) {tryMe (डेटा, "हैलो", "अलविदा");}); –

9

आप एक कॉलबैक कि पैरामीटर की एक विशिष्ट संख्या के साथ अपने कोड के अलावा किसी और के नाम से जाना जाएगा और आप अतिरिक्त पैरामीटर में पास करना चाहते हैं जब आप एक पारित कर सकते हैं रैपर फ़ंक्शन कॉलबैक के रूप में और रैपर के अंदर अतिरिक्त param (ओं) को पास करता है।

function login(accessedViaPopup) { 
    //pass FB.login a call back function wrapper that will accept the 
    //response param and then call my "real" callback with the additional param 
    FB.login(function(response){ 
     fb_login_callback(response,accessedViaPopup); 
    }); 
} 

//handles respone from fb login call 
function fb_login_callback(response, accessedViaPopup) { 
    //do stuff 
} 
4

लपेटें 'बच्चे' समारोह (रों) समारोह रैपर के अंदर तर्क उन्हें रोकने के लिए के साथ/के रूप में पारित किया जा रहा है जब 'माता-पिता' समारोह कहा जाता है मूल्यांकन किया जा रहा। मापदंडों के किसी भी संख्या और एक कॉलबैक संदर्भ के साथ एक सवाल से

function outcome(){ 
    return false; 
} 

function process(callbackSuccess, callbackFailure){ 
    if (outcome()) 
     callbackSuccess(); 
    else 
     callbackFailure(); 
} 

process(function(){alert("OKAY");},function(){alert("OOPS");}) 
3

कोड:

function SomeFunction(name) { 
    this.name = name; 
} 
function tryMe(param1, param2) { 
    console.log(this.name + ": " + param1 + " and " + param2); 
} 
function tryMeMore(param1, param2, param3) { 
    console.log(this.name + ": " + param1 + " and " + param2 + " and even " + param3); 
} 
function callbackTester(callback, callbackContext) { 
    callback.apply(callbackContext, Array.prototype.splice.call(arguments, 2)); 
} 
callbackTester(tryMe, new SomeFunction("context1"), "hello", "goodbye"); 
callbackTester(tryMeMore, new SomeFunction("context2"), "hello", "goodbye", "hasta la vista"); 

// context1: hello and goodbye 
// context2: hello and goodbye and even hasta la vista 
0

परिदृश्य में जहाँ कॉलबैक कुछ अन्य समारोह से कहा जाएगा, नहीं अपने खुद के कोड के लिए एक नया संस्करण और आप अतिरिक्त पैरामीटर जोड़ना चाहते हैं।

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

someObject.doSomething(param1, function(result1) { 
    console.log("Got result from doSomething: " + result1); 
    result.doSomethingElse(param2, function(result2) { 
    console.log("Got result from doSomethingElse: " + result2); 
    }, function(error2) { 
    console.log("Got error from doSomethingElse: " + error2); 
    }); 
}, function(error1) { 
    console.log("Got error from doSomething: " + error1); 
}); 

अब आप त्रुटियों लॉग इन करने के एक समारोह को परिभाषित करने, डीबगिंग उद्देश्यों के लिए त्रुटि के मूल रखकर अपने कोड unclutter कर सकते हैं।

someObject.doSomething(param1, function (result1) { 
    console.log("Got result from doSomething: " + result1); 
    result.doSomethingElse(param2, function (result2) { 
    console.log("Got result from doSomethingElse: " + result2); 
    }, handleError.bind(null, "doSomethingElse")); 
}, handleError.bind(null, "doSomething")); 

/* 
* Log errors, capturing the error of a callback and prepending an id 
*/ 
var handleError = function (id, error) { 
    var id = id || ""; 
    console.log("Got error from " + id + ": " + error); 
}; 

बुला समारोह अभी भी अपने कॉलबैक फ़ंक्शन पैरामीटर के बाद त्रुटि पैरामीटर जोड़ देगा: इस तरह आप अपने कोड refactor करने के लिए आगे बढ़ना होगा है।

0

मैं एक ही चीज़ की तलाश में था और समाधान के साथ समाप्त हुआ और यहां कोई आसान उदाहरण है यदि कोई इस माध्यम से जाना चाहता है।

var FA = function(data){ 
    console.log("IN A:"+data) 
    FC(data,"LastName"); 
}; 
var FC = function(data,d2){ 
    console.log("IN C:"+data,d2) 
}; 
var FB = function(data){ 
    console.log("IN B:"+data); 
    FA(data) 
}; 
FB('FirstName') 

इसके अलावा अन्य प्रश्न पर इस सरल उदाहरण के रूप में here

1

उपयोग curried समारोह पोस्ट किया।

const BTN = document.querySelector('button') 
 
const RES = document.querySelector('p') 
 

 
const changeText = newText =>() => { 
 
    RES.textContent = newText 
 
} 
 

 
BTN.addEventListener('click', changeText('Clicked!'))
<button>ClickMe</button> 
 
<p>Not clicked<p>

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