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

60
demandé sur thisissami 2011-08-14 03:32:48

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));
}
46
répondu aparker42 2011-08-13 23:40:36

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.

35
répondu thisissami 2011-08-14 17:05:20