TransWikia.com

SetTimeOut não funciona

Stack Overflow em Português Asked by Felipe Oliveira on December 5, 2021

Estou usando uma API do Google, e preciso que na parte do request ele espere por pelo menos 3 segundos antes de fazer outra requisição, tentei fazer isso, mas não consegui, o setTimeOut não espera 3 segundos!.

function getLatLong(polos, res) {
  polos.forEach(element => {
    setTimeout(() => {
      request({
        url: 'https://maps.googleapis.com/maps/api/geocode/json?address=' + element.endereco + ' - ' + element.cep + ' - BRASIL' + '&key=AIzaSyCh2Y3mfj2uJtXBHoYeAWvwyHvYCN0iKlk',
        json: true
      }, function (error, response, data) {

        if (data["results"][0]) {
          console.log(data["results"][0].geometry["location"]);
        }else {
          console.log("Não pegou", element.nome)
          return false;
        }
        // res.send(data);
        // var latLong = (data["results"][0].geometry["location"]);
        // console.log(latLong);
      });
    }, 3000);
  });
}

Saída no console :

{ lat: -29.6871895, lng: -53.8090582 }
{ lat: -23.4391891, lng: -51.9142814 }
{ lat: -23.1814106, lng: -50.6480145 }
Não pegou ASTORGA - PR
Não pegou POÇOS DE CALDAS - MG
Não pegou SALVADOR - BA
Não pegou GOIOERÊ - PR
{ lat: -20.4557007, lng: -54.5936527 }
{ lat: -26.9205582, lng: -49.0696077 }
Não pegou CAMPO MOURÃO - PR
{ lat: -27.5991936, lng: -48.6084431 }
Não pegou PATROCÍNIO - MG
Não pegou SUZANO - SP
Não pegou PORECATU - PR
{ lat: -22.5292946, lng: -52.1804526 }
{ lat: -10.1870213, lng: -48.3282553 }
Não pegou LAGES - SC
{ lat: -26.488296, lng: -49.0828988 }
{ lat: -16.4696391, lng: -54.6311907 }
{ lat: -23.3034209, lng: -51.1419351 }
Não pegou OLINDA - PE
{ lat: -24.9553923, lng: -53.4575696 }
{ lat: -19.9689819, lng: -44.2008435 }
Não pegou RIO DE JANEIRO - TIJUCA - RJ

O problema é ele não está esperando 3 segundo antes de fazer outra requisição. O que eu poderia fazer?

2 Answers

Esses 3 segundos foram especificados pelo Google ou você só não quer que sejam feitas duas requisições ao mesmo tempo?

Você poderia mudar seu código de forma que a função trate apenas um elemento, e quando terminar de processar o retorno, chama ela mesma para processar o próximo elemento, enquanto houver.

// A primeira chamada é só para o primeiro elemento
getLatLong(polos, 0, res);

function getLatLong(polos, index, res) 
{ 
    request({ 
        url: 'https://maps.googleapis.com/maps/api/geocode/json?address=' + polos[index].endereco + ' - ' + polos[index].cep + ' - BRASIL' + '&key=AIzaSyCh2Y3mfj2uJtXBHoYeAWvwyHvYCN0iKlk', 
        json: true }, 
        function (error, response, data) { 
            if (data["results"][0])
            {
                console.log(data["results"][0].geometry["location"]); 
            }else { 
                console.log("Não pegou", element.nome) return false; 
            } 
            // res.send(data);
             // var latLong = (data["results"][0].geometry["location"]); 
            // console.log(latLong); 

            // Chama o próximo elemento
            if (index < polos.lenght - 1)
                getLatLong(polos, index + 1, res);
        }); 
    }

Answered by Marlon on December 5, 2021

Eles esperam os 3 segundos porém, todos os timeouts serão liberados depois de 3 segundos, ao mesmo tempo. Você deve utilizar um contador, para que o segundo timeout saia depois de 6 segundos.

  var cont = 1;
  polos.forEach(function(element){
     setTimeout(function(){
       ...
     }, 3000*cont);
     cont++;
  });

O problema já seria resolvido com 2 linhas amais de código, com isso:

  • O primeiro timeout será liberado em 3 segundos;
  • O segundo timeout será liberado em 6 segundos;
  • O terceiro, 9 segundos;

e assim por diante.

Answered by Sveen on December 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP