Quand vous utilisez des callbacks à l'intérieur d'une boucle dans javascript, y a-t-il un moyen de sauvegarder une variable qui est mise à jour dans la boucle pour être utilisée dans la callback? [dupliquer]
cette question a déjà une réponse ici:
disons que j'ai quelque chose comme suit:
for(var i = 0; i < length; i++){
var variable = variables[i];
otherVariable.doSomething(variable, function(err){ //callback for when doSomething ends
do something else with variable;
}
au moment où les callbacks sont appelés, variable
sera inévitablement être la dernière variable pour tous les callbacks, au lieu d'être une variable différente pour chaque callback, comme je le voudrais. Je me rends compte que je pourrais passer variable
à doSomething()
et ensuite obtenir que passé en tant que partie du rappel, mais doSomething()
fait partie d'une bibliothèque externe, et je ne préfère pas déconner avec le code source pour cela.
est-ce que ceux d'entre vous qui connaissent JavaScript mieux que moi savent s'il y a d'autres façons de faire ce que j'aimerais faire?
le Meilleur, et de grâce,
Sami
2 réponses
une façon courante, bien que laide, de faire face à cette situation est d'utiliser une autre fonction qui est immédiatement invoquée pour créer une portée pour tenir la variable.
for(var i = 0; i < length; i++) {
var variable = variables[i];
otherVariable.doSomething(function(v) { return function(err) { /* something with v */ }; }(variable));
}
notez que dans la fonction immédiatement invoquée le rappel qui est créé, et retourné, renvoie le paramètre à la fonction v
et non à l'extérieur variable
. Pour que cela se lise beaucoup mieux, je suggérerais d'extraire le constructeur du callback comme un nommé fonction.
function callbackFor(v) {
return function(err) { /* something with v */ };
}
for(var i = 0; i < length; i++) {
var variable = variables[i];
otherVariable.doSomething(callbackFor(variable));
}
Ok j'ai semblé comprendre ça. Ce que j'ai dû faire était de mettre un function(var)
wrapper autour de otherVariable.doSomething()
, de sorte que le code mis à jour ressemble à ce qui suit:
for(var i = 0; i < length; i++){
var variable = variables[i];
(function(var){ //start wrapper code
otherVariable.doSomething(var, function(err){ //callback for when doSomething ends
do something else with var; //please note that i'm dealing with var here, not variable
}
})(variable);//passing in variable to var here
}
espérons que cela aide quelqu'un d'autre qui est coincé sur quelque chose comme ça dans le futur!
@aparker42, j'aimerais toujours entendre votre réponse à ma question dans le commentaire à votre question, car cela me confond encore.
EDIT: bien sûr, depuis c'est javascript, vous ne voudriez pas utiliser var
comme nom de variable.