J'ai récemment été confronté à la situation unique de devoir utiliser un setTimeout
dans une boucle. Comprendre cela peut vous aider à comprendre comment passer des paramètres à setTimeout
.
Méthode 1
Utilisez forEach
et Object.keys
, comme le suggère Sukima dans sa suggestion :
var testObject = {
prop1: 'test1',
prop2: 'test2',
prop3: 'test3'
};
Object.keys(testObject).forEach(function(propertyName, i) {
setTimeout(function() {
console.log(testObject[propertyName]);
}, i * 1000);
});
Je recommande cette méthode.
Méthode 2
Utilisez bind
:
var i = 0;
for (var propertyName in testObject) {
setTimeout(function(propertyName) {
console.log(testObject[propertyName]);
}.bind(this, propertyName), i++ * 1000);
}
JSFiddle : http://jsfiddle.net/MsBkW/
Méthode 3
Ou si vous ne pouvez pas utiliser forEach
ou bind
, utilisez une IIFE :
var i = 0;
for (var propertyName in testObject) {
setTimeout((function(propertyName) {
return function() {
console.log(testObject[propertyName]);
};
})(propertyName), i++ * 1000);
}
Méthode 4
Mais si vous ne vous souciez pas de IE < 10, alors vous pourriez utiliser la suggestion de Fabio :
var i = 0;
for (var propertyName in testObject) {
setTimeout(function(propertyName) {
console.log(testObject[propertyName]);
}, i++ * 1000, propertyName);
}
Méthode 5 (ES6)
Utilisez une variable à portée de bloc :
let i = 0;
for (let propertyName in testObject) {
setTimeout(() => console.log(testObject[propertyName]), i++ * 1000);
}
Cependant, je vous recommande toujours d'utiliser Object.keys
avec forEach
en ES6.
92 votes
Cela fait un peu mal de commenter un sujet aussi ancien mais je dois juste offrir une troisième version (qui, à mon avis, est beaucoup plus propre) : setTimeout(postinsql.bind(null, topicId), 4000)
3 votes
Tout est clair ici : w3schools.com/jsref/met_win_settimeout.asp
1 votes
Liées: Pourquoi la méthode est-elle exécutée immédiatement lorsque j'utilise setTimeout?, Appeler des fonctions avec setTimeout(), qu'est-ce que le troisième paramètre dans la fonction setTimeout?.