2010-09-05 2 views
2

Ceci est mon code:setTimeout en boucle pour vérifier un changement dans les limites

var b; 
while(!b){ 
    setTimeout(function(){ 
     alert('sss') 
     b=1; 
    }, 500); 
} 

et il ne sera pas alerte « sss »

Que puis-je faire?

Mise à jour:

Je veux obtenir des limites sur google maps v3:

function get_bounds(){ 
      var bounds_; 
      while(!bounds_){ 
       setTimeout(function(){ 
        bounds_=map.getBounds(); 
        if(bounds_){ 
         var leftBottom=[bounds_.getSouthWest().lat(),bounds_.getSouthWest().lng()] 
         var rightTop=[bounds_.getNorthEast().lat(),bounds_.getNorthEast().lng()] 
         return [leftBottom,rightTop]; 
         } 
       }, 500); 
      } 
     } 

updated2:

salut patrick dw, je ne sais pas pourquoi, mais votre le code ne fonctionne pas:

var b; 
function waitForB() { 
    setTimeout(function(){ 
     if(!b) 
      waitForB(); 
     else 
      alert('sss'); 
    }, 500); 
} 
waitForB() 

updated3:

il est ok maintenant:

var b; 
function waitForB() { 
    setTimeout(function(){ 
     if(!b){ 
      waitForB(); 
      b='ss'; 
     } 
     else{ 
      alert('sss') 
     } 
    }, 500); 
} 
waitForB() 
+1

Vous avez oublié un point-virgule après alerte (...) –

+1

Oui c'est vrai, mais les points-virgules ne sont pas toujours obligatoires en Javascript. – Pointy

+1

@Radomir: Grâce à JavaScript, le ';' ne fera pas vraiment de différence. JS assumera une nouvelle ligne comme un délimiteur de ligne en l'absence d'un ';' ou n'étant pas dans un bloc '(...)'. –

Répondre

5

JavaScript dans les navigateurs Web est exécuté dans un seul fil. Lorsque vous appelez setTimeout(), il ne génère pas un nouveau thread. Cela signifie que setTimeout() ne s'exécutera pas tant que le code principal n'aura pas été exécuté. Pour cette raison, vous finirez avec une boucle infinie, car votre condition de boucle dépend de l'exécution du rappel setTimeout().

Voici un article intéressant sur le fonctionnement des minuteries JavaScript:


MISE À JOUR:

Suite à la question mise à jour, vous voudrez peut-être pour écouter l'événement bounds_changed à la place. Je ne sais pas comment vous prévoyez d'utiliser votre fonction get_bounds(), mais vous pouvez factoriser votre logique d'utiliser un écouteur d'événement à la place:

google.maps.event.addListener(map,'bounds_changed', function() { 
    // The code here is triggered when the bounds change 
}); 
+0

Salut Daniel, regarde la mise à jour, je veux obtenir les limites de Google Maps v3, mais parfois je ne peux pas l'obtenir, donc je dois l'obtenir parfois plus tard, alors que puis-je faire à ce sujet .. – zjm1126

+1

@ zjm1126: Pourquoi n'écoutez-vous pas l'événement 'bounds_changed'? 'google.maps.event.addListener (map, 'bounds_changed', function() {});' –

+0

c'est une bonne idée. – zjm1126

1

Ce code va brûler temps CPU et de la mémoire en programmant les délais d'attente pour arriver. Pensez-y: votre condition de boucle est "b" devenir véridique. Comment cela va-t-il se passer? Seulement quand un événement de minuterie se déclenche. Cela arrivera-t-il? Non, parce que vous mangez toute la machine programmant des zillions plus de temps morts.

Ce genre de situation a comme témoin signe pour effet de réchauffer la pièce que vous êtes assis dans.

Je ne sais pas quel effet vous essayez d'obtenir. Pourquoi ne pas commencer par juste l'appel setTimeout() et voir comment cela se passe. Peut-être pourriez-vous décrire davantage ce que vous essayez de faire.

0

Peut-être que vous voudrez utiliser setInterval au lieu de setTimeout. Lorsque b est modifié, l'alerte s'affiche.

var b = false; 
(function() { 
    var intervalId; 
    function wait() { 
     if (b) { 
      clearInterval(intervalId); 
      alert('sss'); 
     } 
    } 
    intervalId = setInterval(wait, 500); 
})(); 

Il est plus intuitif et ne dérange pas trop les variables globales. CONSEIL: Placez le point-virgule après chaque instruction si vous n'êtes pas sûr de l'endroit où vous voulez l'omettre en toute sécurité.

0

Ce problème peut maintenant être résolu en utilisant correctement l'idle plutôt que l'écouteur d'événement bounds_changed:

google.maps.event.addListener(map, 'idle', function() { 
    updateStuff(); 
}); 

Cet événement est déclenché lorsque la carte devient inactif après panoramique ou un zoom. http://code.google.com/apis/maps/documentation/javascript/reference.html

Il tire également après la carte est d'abord rendu, il est sans doute le seul écouteur d'événement dont vous avez besoin sur votre carte afin de le maintenir à jour.

Questions connexes