Passage de parameters dans une fermeture pour setTimeout

J’ai rencontré un problème où mon application réside dans un iframe et qu’elle est appelée depuis un domaine externe. IE9 ne déclenche pas l’événement load lorsque l’iframe est chargé correctement. Je pense donc que je suis bloqué à l’aide de setTimeout pour interroger la page.

Quoi qu’il en soit, je veux voir quelle durée est généralement nécessaire pour terminer mon setTimeout. Je souhaitais donc pouvoir enregistrer le délai de déclenchement de setTimeout à partir de mon rappel, mais je ne sais pas comment passer ce contexte afin que je puisse connectez-le.

App.readyIE9 = function() { var timings = [1,250,500,750,1000,1500,2000,3000]; for(var i = 0; i < timings.length; i++) { var func = function() { if(App.ready_loaded) return; console.log(timings[i]); App.readyCallBack(); }; setTimeout(func,timings[i]); } }; 

Je continue à obtenir LOG: non défini dans la console de IE9.

Quelle est la méthode appropriée pour accomplir cela?

Merci

    Cela se produit parce que vous ne vous approchez pas de la valeur de i dans votre func . Lorsque la boucle est terminée, i est timings.length 8 ( timings.length ), ce qui n’existe pas dans le tableau.

    Vous devez faire quelque chose comme ça:

     App.readyIE9 = function() { var timings = [1,250,500,750,1000,1500,2000,3000]; for(var i = 0; i < timings.length; i++) { var func = function(x) { return function(){ if(App.ready_loaded) return; console.log(timings[x]); App.readyCallBack(); }; }; setTimeout(func(i),timings[i]); } }; 

    Lorsque votre fonction sera appelée par setTimeout ultérieurement, la valeur de i a déjà été incrémentée à la fin de sa plage par la boucle for so console.log(timings[i]); rapports undefined .

    Pour utiliser i dans cette fonction, vous devez la capturer dans une fermeture de fonction. Il y a plusieurs façons de le faire. Je suggérerais d’utiliser une fonction auto-exécutante pour capturer la valeur de i like this:

     App.readyIE9 = function() { var timings = [1,250,500,750,1000,1500,2000,3000]; for(var i = 0; i < timings.length; i++) { (function(index) { setTimeout(function() { if(App.ready_loaded) return; console.log(timings[index]); App.readyCallBack(); }, timings[index]); })(i); } }; 

    Pour expliquer qui cela fonctionne: i est passé à la fonction à exécution automatique en tant que premier argument de cette fonction. Ce premier argument s'appelle index et est gelé à chaque appel de la fonction à exécution automatique. Par conséquent, la boucle for ne le modifiera pas avant l'exécution du rappel setTimeout . Ainsi, l' index référencement à l'intérieur de la fonction à exécution automatique obtiendra la valeur correcte de l'index du tableau pour chaque rappel setTimeout .

    Il s’agit d’un problème habituel lorsque vous setInterval rappels setTimeout ou setInterval . Vous devriez passer la valeur i à la fonction:

     var timings = [1, 250, 500, 750, 1000, 1500, 2000, 3000], func = function(i) { return function() { console.log(timings[i]); }; }; for (var i = 0, len = timings.length; i < len; i++) { setTimeout(func(i), timings[i]); } 

    DEMO: http://jsfiddle.net/r56wu8es/