2017-04-20 2 views
0

J'utilise google Geocode api pour boucler et géocoder une liste de 22 codes postaux et les stocker dans une base de données. Je voudrais afficher un message quand le géocodage est fait, cependant comme je dois utiliser setTimeout pour éviter de courir dans l'erreur "OVER_QUERY_LIMIT" à 11 postcodes, mon message apparaît beaucoup plus tôt que ce que le processus prend réellement. Comment puis-je résoudre ça?comment afficher le message après boucle est terminée lorsque setTimeout est impliqué?

JS

   function geocodeAddress (postcode) { 
        geocoder.geocode({'address': postcode}, function(results, status) { 

         if (status === 'OK') { 
          var x, 
           resultsLength = results.length; 

          for(x = 0; x < resultsLength; x++) { 
           lat = results[x].geometry.location.lat().toFixed(8); 
           lng = results[x].geometry.location.lng().toFixed(8); 
           //send values to php file 
           sendLatLng(lat, lng); 
          } 
         } 
         else if (status == 'OVER_QUERY_LIMIT') { 
          //call function again after delay when error is encountered 
          setTimeout(function() { 
           geocodeAddress(postcode); 
          }, 200); 
         } 
         else { 
          console.log('Geocode was not successful: ' + status); 
         } 
        }); 
       }; 

       for (n = 0; n < pstcodeLength; n++) { 
        geocodeAddress(postcodes[n]); 
        //display message after loop is complete 
        if (n === pstcodeLength-1) { 
         console.log('geocoding is complete'); 
        } 
       } 
+0

Vous dites que le «géocodage est complet» est en train de se produire trop tôt? Bien sûr, car les requêtes asynchrones sont toujours en cours lorsque la boucle est terminée. – epascarello

+0

Oui je sais, est-il possible d'afficher après que tout est fait? – Sai

+0

SO gardez la trace de chacun qui est complet et quand vous atteignez le maximum, affichez le message. – epascarello

Répondre

0

ne cessent de suivre le nombre qui sont complètes. Lorsque vous obtenez le maximum, affichez le message.

var cnt = 0; 

function geocodeAddress(postcode) { 
    geocoder.geocode({ 
    'address': postcode 
    }, function(results, status) { 

    if (status === 'OK') { 
     var x, 
     resultsLength = results.length; 

     for (x = 0; x < resultsLength; x++) { 
     lat = results[x].geometry.location.lat().toFixed(8); 
     lng = results[x].geometry.location.lng().toFixed(8); 
     //send values to php file 
     sendLatLng(lat, lng); 
     } 
     cnt++; 
    } else if (status == 'OVER_QUERY_LIMIT') { 
     //call function again after delay when error is encountered 
     setTimeout(function() { 
     geocodeAddress(postcode); 
     }, 200); 
    } else { 
     cnt++; 
     console.log('Geocode was not successful: ' + status); 
    } 

    if (cnt === pstcodeLength) { 
     console.log('geocoding is complete'); 
    } 
    }); 
};