J'écris la fonction Node.JS lambda, où j'ai besoin d'appeler une fonction API avec callback et d'y passer des paramètres supplémentaires.Rappel avec des paramètres supplémentaires dans la boucle
Le code ressemble à:
var s3 = ...;
for (var i = 0; i < data.foo.length; i++) {
var v1 = data.foo[i].name;
console.log("Loop: " + v1);
var params = { ... };
foo.method1(params, function(err, data1) {
console.log("Method1: " + v1);
s3.putObject(....);
});
}
Voici deux problèmes.
Je ne comprends pas pourquoi, mais à l'intérieur du rappel passé à
foo.method1...
j'ai toujours la même valeur dev1
(je suppose qu'il est le dernier à partir du tableau).Le contrôleur de code de la console Amazon me conseille qu'il est une mauvaise pratique pour créer une fonction dans une boucle:
Ne faites pas de fonctions dans une boucle.
Je suppose que p.1 est en quelque sorte lié à p.2 :-) Voilà pourquoi j'ai essayé de créer une fonction nommée et de transmettre sa référence à foo.method1
. Mais cela ne fonctionne pas car je ne peux pas passer les paramètres supplémentaires v1
et s3
là. Je ne peux terminer son appel comme:
foo.method1(params, function(err, data1) {
myCallback(err, data1, v1, s3);
});
- ce qui n'a pas de sens, car le résultat est le même.
Conseil: foo.method1
est apparemment asynchrone.
Je doute de la façon de résoudre ce problème?
'v1' est pris dans la fermeture de chaque fonction. Toutes les fonctions se réfèrent à la même copie en direct de 'v1', qui sera la dernière valeur au moment où les fonctions sont appelées. Une solution consiste à utiliser 'let', comme décrit ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Cleaner_code_in_inner_functions – skirtle