Existe-t-il un moyen de passer plus de données dans une fonction de rappel dans jQuery?
J'ai deux fonctions et je veux que le rappel à $.post
, par exemple, passe à la fois les données résultantes de l'appel AJAX, ainsi que quelques arguments personnalisés
function clicked() {
var myDiv = $("#my-div");
// ERROR: Says data not defined
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
// ERROR: Would pass in myDiv as curData (wrong)
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
}
function doSomething(curData, curDiv) {
}
Je veux pouvoir transmettre mes propres paramètres à un rappel, ainsi que le résultat renvoyé par l'appel AJAX.
Réponses:
La solution est la liaison des variables par la fermeture.
Comme exemple plus basique, voici un exemple de fonction qui reçoit et appelle une fonction de rappel, ainsi qu'un exemple de fonction de rappel:
Cela appelle le rappel et fournit un seul argument. Maintenant, vous voulez fournir un argument supplémentaire, vous devez donc boucler le rappel en fermeture.
Ou, plus simplement en utilisant les fonctions fléchées ES6 :
Quant à votre exemple spécifique, je n'ai pas utilisé la
.post
fonction dans jQuery, mais une analyse rapide de la documentation suggère que le rappel devrait être un pointeur de fonction avec la signature suivante:Je pense donc que la solution est la suivante:
Qu'est-ce qui se passe?
Dans la dernière ligne,
doSomething(extraStuff)
est invoqué et le résultat de cette invocation est un pointeur de fonction .Parce qu'il
extraStuff
est passé en argument,doSomething
il est dans le cadre de ladoSomething
fonction.Lorsque
extraStuff
est référencé dans la fonction interne anonyme retournée,doSomething
il est lié par la fermeture à l'extraStuff
argument de la fonction externe . Cela est vrai même aprèsdoSomething
son retour.Je n'ai pas testé ce qui précède, mais j'ai écrit un code très similaire au cours des dernières 24 heures et cela fonctionne comme je l'ai décrit.
Vous pouvez bien sûr transmettre plusieurs variables au lieu d'un seul objet «extraStuff» en fonction de vos préférences personnelles / normes de codage.
la source
Lorsque vous utilisez
doSomething(data, myDiv)
, vous appelez en fait la fonction et ne faites pas de référence à elle.Vous pouvez soit passer la
doStomething
fonction directement, mais vous devez vous assurer qu'elle a la signature correcte.Si vous voulez continuer à faire quelque chose comme ça, vous pouvez envelopper son appel dans une fonction anonyme.
Dans le code de fonction anonyme, vous pouvez utiliser les variables définies dans la portée englobante. C'est ainsi que fonctionne la portée de Javascript.
la source
return function(...){...}
fonction supplémentaire dans ladoSomething
fonction. J'ai trouvé un autre exemple clair du même concept ici: theelitist.net/…(function(myDiv){ ... })(myDiv)
pour capturer la variablemyDiv
. Ceci est implicitement fait dans la réponse @bradhouse.C'est en fait plus facile que tout le monde le fait sonner ... surtout si vous utilisez la
$.ajax({})
syntaxe de base par rapport à l'une des fonctions d'assistance.Passez simplement la
key: value
paire comme vous le feriez sur n'importe quel objet, lorsque vous configurez votre demande ajax ... (car$(this)
n'ayant pas encore changé de contexte, c'est toujours le déclencheur de l'appel de liaison ci-dessus)L'une des raisons pour lesquelles cela vaut mieux que de définir la var, c'est que la var est globale et en tant que telle, écrasable ... si vous avez 2 choses qui peuvent déclencher des appels ajax, vous pourriez en théorie les déclencher plus rapidement que l'appel ajax ne répond, et vous auriez la valeur pour le deuxième appel passé dans le premier. En utilisant cette méthode, ci-dessus, cela ne se produirait pas (et c'est assez simple à utiliser aussi).
la source
closure
j'en ai juste besoin pour travailler et c'est absolument parfait, propre, simple et non global.Dans le monde d'aujourd'hui, il existe une autre réponse qui est plus propre et tirée d'une autre réponse Stack Overflow:
Voici la question et la réponse d'origine: jQuery COMMENT FAIRE ?? passer des paramètres supplémentaires pour réussir le rappel pour l'appel $ .ajax?
la source
Vous pouvez également essayer quelque chose comme ceci:
la source
Vous pouvez utiliser une fermeture de JavaScript:
et quand vous pouvez faire:
la source
J'ai fait une erreur dans le dernier mon post. C'est un exemple de travail pour savoir comment passer un argument supplémentaire dans la fonction de rappel:
la source
Allons simple! :)
la source
Une solution plus générale pour envoyer des requêtes asynchrones à l'aide de l'
.ajax()
API jQuery et des fermetures pour transmettre des paramètres supplémentaires à la fonction de rappel:la source
Pour moi, et pour les autres débutants qui viennent de contacter Javascript,
je pense que
Closeure Solution
c'est un peu trop déroutant.Bien que je trouve cela, vous pouvez facilement passer autant de paramètres que vous le souhaitez à chaque rappel ajax en utilisant jquery.
Voici deux solutions plus simples .
Premier, dont @zeroasterisk a mentionné ci-dessus, exemple:
Deuxièmement, passez des données auto-définies en les ajoutant à celles
XHR object
qui existent dans toute la durée de vie de ajax-request-response.Comme vous pouvez le voir, ces deux solutions ont un inconvénient: vous avez besoin d'écrire un peu plus de code à chaque fois que d'écrire simplement:
En savoir plus sur $ .ajax: http://api.jquery.com/jquery.ajax/
la source
Si quelqu'un vient encore ici, voici mon avis:
Ce qui se passe ici, après la liaison à la fonction de rappel, il sera disponible dans la fonction en tant que
this
.Cette idée vient de la façon dont React utilise la
bind
fonctionnalité.la source
Voie secondaire:
la source
en fait, votre code ne fonctionne pas car lorsque vous écrivez:
vous placez un appel de fonction comme troisième paramètre plutôt qu'une référence de fonction .
la source
En complément de la réponse de b01 , le deuxième argument de
$.proxy
est souvent utilisé pour conserver lathis
référence. Les arguments supplémentaires passés à$.proxy
sont partiellement appliqués à la fonction, en la préremplissant de données. Notez que tous les arguments$.post
passés au rappel seront appliqués à la fin, doncdoSomething
devraient avoir ceux à la fin de sa liste d'arguments:Cette approche permet également de lier plusieurs arguments au rappel:
la source