Je comprends que le transfert d’une fonction à une autre fonction sous forme de rappel et l’exécution s’effectue, mais je ne comprends pas la meilleure implémentation pour le faire. Je cherche un exemple très basique, comme ceci:
var myCallBackExample = {
myFirstFunction : function( param1, param2, callback ) {
// Do something with param1 and param2.
if ( arguments.length == 3 ) {
// Execute callback function.
// What is the "best" way to do this?
}
},
mySecondFunction : function() {
myFirstFunction( false, true, function() {
// When this anonymous function is called, execute it.
});
}
};
Dans myFirstFunction, si je renvoie un nouveau callback (), cela fonctionne et exécute la fonction anonyme, mais cela ne semble pas être la bonne approche pour moi.
Tu peux juste dire
callback();
Vous pouvez également utiliser la méthode call
si vous souhaitez ajuster la valeur de this
dans le rappel.
callback.call( newValueForThis);
Dans la fonction this
serait ce que newValueForThis
est.
Vous devriez vérifier si le rappel existe et est une fonction exécutable:
if (callback && typeof(callback) === "function") {
// execute the callback, passing parameters as necessary
callback();
}
De nombreuses bibliothèques (jQuery, dojo, etc.) utilisent un modèle similaire pour leurs fonctions asynchrones, ainsi que node.js pour toutes les fonctions asynchrones (nodejs transmet généralement error
et data
au rappel). . Regarder dans leur code source pourrait aider!
Il y a 3 possibilités principales pour exécuter une fonction:
var callback = function(x, y) {
// "this" may be different depending how you call the function
alert(this);
};
La méthode que vous choisissez dépend si:
Docs pour Function.call , Function.apply
Les rappels concernent les signaux et le terme "nouveau" concerne la création d'instances d'objet.
Dans ce cas, il serait encore plus approprié d'exécuter simplement "callback ();" que "return new callback ()" car de toute façon, vous ne faites rien avec une valeur de retour.
(Et le test arguments.length == 3 est vraiment maladroit, mieux vaut vérifier que le paramètre callback existe et est une fonction.)
la bonne mise en œuvre serait:
if( callback ) callback();
cela rend le paramètre de rappel facultatif.
Vous pouvez utiliser:
if (callback && typeof(callback) === "function") {
callback();
}
L'exemple ci-dessous est un peu plus complet:
function mySandwich(param1, param2, callback) {
alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);
var sandwich = {
toppings: [param1, param2]
},
madeCorrectly = (typeof(param1) === "string" && typeof(param2) === "string") ? true : false;
if (callback && typeof(callback) === "function") {
callback.apply(sandwich, [madeCorrectly]);
}
}
mySandwich('ham', 'cheese', function(correct) {
if (correct) {
alert("Finished eating my " + this.toppings[0] + " and " + this.toppings[1] + " sandwich.");
} else {
alert("Gross! Why would I eat a " + this.toppings[0] + " and " + this.toppings[1] + " sandwich?");
}
});
function checkCallback(cb) {
if (cb || cb != '') {
if (typeof window[cb] === 'undefined') alert('Callback function not found.');
else window[cb].call(this, Arg1, Arg2);
}
}
Voici un exemple de base qui explique la fonction callback()
en JavaScript:
var x = 0;
function testCallBack(param1, param2, callback) {
alert('param1= ' + param1 + ', param2= ' + param2 + ' X=' + x);
if (callback && typeof(callback) === "function") {
x += 1;
alert("Calla Back x= " + x);
x += 1;
callback();
}
}
testCallBack('ham', 'cheese', function() {
alert("Function X= " + x);
});