2009-11-02 3 views
1

Je suis conscient que lors du codage d'une extension, il est impossible de retarder un appel de fonction à l'exception de l'utilisation d'un appel setTimeout, mais voici ce que j'essaie d'obtenir dans un plugin je développe pour Firefox (ce qui est pas javascript intégré dans une page Web par la voie):Javascript dans Firefox Plugin: Retarder dans la boucle

for (var i = 0; i < t.length; i ++) {

//Load a URL from an array 
//On document complete, get some data 

}

L'idée est simple. J'ai un tableau d'URL que je veux analyser et extraire des données sur. Chacune de ces URL prend du temps à charger. Donc, si j'essaie d'obtenir des données de la page en cours sans attendre le chargement de la page, j'obtiendrai une erreur. Maintenant, la seule façon de le faire que je sache, est la suivante:

firstFunction: function() {

//Load the first url 
    setTimeout("secondfunction", 5000); 

}

secondFunction: function() {

//Load the second url 
setTimeout("thirdfunction", 5000); 

}

Et ainsi de suite ... Je sais que c'est évidemment faux .. Je me demandais comment les gens y parviennent en javascript ...

EDIT: Désolé de ne pas être plus de détails ...

+1

S'il vous plaît ajouter un peu plus d'info - Je suis peut-être manquant, mais je ne comprends pas non plus ce que vous essayez de faire ou ce que le problème serait alors. –

+1

Vous pouvez masquer cette async. style de programmation plus, mais c'est à peu près tout. –

+0

Vous mêlez des questions dans votre question. Il semble que vous demandiez une façon plus agréable d'écrire du code que setTimeouts (pour que votre logique ne soit pas dispersée entre plusieurs fonctions). Puis, dans un commentaire à une réponse, vous indiquez que la raison pour laquelle vous ne voulez pas utiliser setTimeout est que c'est incorrect. Si c'est le cas, consultez la réponse de James - vous devriez utiliser les rappels appropriés (qui ne sont pas basés sur le temps, mais basés sur les événements). – Nickolay

Répondre

1

Je Je ne suis pas convaincu que ce type de folie est nécessaire mais je ne suis pas un développeur de dev donc qui sait. Si cela est l'approche que vous voulez, alors que la à la même fonction référer appel setTimeout:

var index; 
firstfunction: function() { 
    // do something with `index` and increment it when you're done 

    // check again in a few seconds (`index` is persisted between calls to this) 
    setTimeout("firstfunction", 5000); 
} 
+0

Merci pour ça ...Juste que je cherchais une approche qui n'utilise pas le setTimeout qui est une fonction très risquée. Par exemple, si la page prend plus de 5 secondes à charger, le code se cassera ... – Legend

+0

Vous pouvez l'appeler plusieurs fois. Je pense que vous avez le pressentiment que cette approche est incorrecte, cependant, je ne sais pas grand-chose de ce domaine - désolé! –

1

Je ne sais pas comment faire cela à partir d'un plug-in, mais ce que je l'ai fait avec iframes dans le passé est attacher un rappel à l'événement onLoad du document cible.

Peut-être quelque chose comme:

var index = 0; 
var urls = [ ..... ]; 
function ProcessDocument() { ....; LoadNextDocument(); } 
function LoadNextDocument() { index++; /* Load urls[index] */; } 
document.body.onLoad = ProcessDocument; 

Quelque part là-bas, vous aurez besoin de tester pour l'index> urls.length trop pour votre condition de fin.

0

J'ai eu le même problème mais j'ai utilisé la récursivité au lieu de boucler. Vous trouverez ci-dessous le code qui modifie le innerHTML d'un élément en effectuant une boucle dans la liste. J'espère que c'est utile.

<Script type="text/javascript"> 
var l; 
var a; 
function call2() 
{ 
    l = document.getElementById('listhere').innerHTML; 
    a = l.split(","); 
    call1(0); 
} 

function call1(counter) 
{ 
    if(a.length > counter) 
    { 
     document.getElementById('here').innerHTML = a[counter]; 
     counter++; 
     setTimeout("call1("+counter+")",2000); 
    } 
} 

</Script> 

    <body onload="call2()"> 
    <span id="listhere">3,5,2,8</span><Br /> 
    <span id="here">here</span>