2 votes

Javascript - ajouter des paramètres supplémentaires à une fonction de rappel (callback)

J'appelle une fonction asynchrone qui a besoin d'une fonction de rappel comme paramètres.

Voici le code javascript :

for(i in array) 
{
    var item = array[i];
    functionToCall(item[i][1], 50, function(a, b)
    {
        alert(a + b);
    });
}

Je ne peux pas modifier la fonction functionToCall. Ce que je veux faire, c'est utiliser la variable "item" dans la fonction de rappel comme ceci.

for(i in array) 
{
    var item = array[i];
    functionToCall(item[i][1], 50, function(a, b, c)
    {
        alert(a + b + c);
    }, item);
}

Mais ce code ne fonctionne pas correctement. Je ne peux pas utiliser "item" dans la fonction car elle utilise toujours le dernier élément du tableau.

Alors comment puis-je faire ça ?

4voto

Jordão Points 29221

Vous pouvez utiliser item à l'intérieur de la fonction, mais vous devez le "capturer" afin de ne pas utiliser le dernier élément du tableau à chaque fois.

for(var i = 0, l = array.length; i < l; ++i) { // better than for .. in
    var item = array[i];
    (function(item, i){
      functionToCall(item[i][1], 50, function(a, b) // do you really re-index item with the same index?
      {
          alert(a + b);
      });
    })(item, i);
}

0voto

gilly3 Points 33285

C'est une mauvaise idée d'utiliser for..in pour itérer des tableaux. Utilisez plutôt .forEach() et beaucoup de vos problèmes disparaissent :

array.forEach(function(item)
{ 
    functionToCall(item[1], 50, function(a, b) 
    { 
        alert(a + b + item[1]); 
    }); 
}

Pour utiliser .forEach() dans les navigateurs plus anciens, voir ceci .

0voto

Tejs Points 23834

J'essaierais quelque chose comme ça :

 function createExecutionCall(itemIndex, number, item)
 {
      return function() { functionToCall(itemIndex, number, function(a, b)
      {
           // Example, item should be contained within this closure then
           alert(a + b + item);
      });
 }

 for(i in array) 
 {
     var item = array[i];

     var call = createExecutionCall(item[i][1], 50, item);
     call();
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X