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?
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:
e assim por diante.
Answered by Sveen on December 5, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP