我的函数遇到一些问题,问题是直到地图末尾所有的Establishment.finById()都将被忽略,如果在if上输入的每个项目都需要findById。在地图的末尾,finById触发,但仅在最后一个地图对象上发生。我可以使用另一张地图来解决此问题,但是我不想这样做。 我认为问题出在异步/等待,但我不知道是什么。
try{
Logger.log("Info", "Buscando estabelecimentos na API.");
const url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=' + latitude + ',' + longitude + '&radius=200&type=store&key=' + GOOGLE_PLAY_API;
axios.get(url).then(response => {
let resultados = response.data.results;
if(resultados.length == 0) {
Logger.log("Info", "Nenhum resultado encontrado pela API");
return resposta.status(404).send("Nenhum resultado encontrado pela API");
} else {
resultados.map((item, i) => {
let found = item.types.some(r => tipos_estabelecimentos.indexOf(r) >= 0);
if(found){
var _estabelecimento = new Estabelecimento({
_id: item.place_id,
nome: item.name,
localizacao: { type: "Point", coordinates: [item.geometry.location.lng, item.geometry.location.lat]}
});
Estabelecimento.findById(_estabelecimento._id).then((result) => {
if(!result || result.length == 0){
_estabelecimento.save().then((success) => {
Logger.log("Info", "Cadastrando novo estabelecimento: " + success);
listaEstabelecimentos.push(success);
}).catch((error) => {
if(error){
Logger.log("Erro", "Erro ao cadastrar estabelecimento " + error);
}
});
} else {
Logger.log("Info", "Estabelecimento " + _estabelecimento.name + " já cadastrado. Pulando...");
}
});
}
});
}
return resposta.status(200).send(listaEstabelecimentos);
}).catch(error => {
return resposta.status(500).send(error);
});
} catch(error) {
console.log(error);
}
答案 0 :(得分:2)
您说对了,因为findById
是异步的。如果将所有这些异步承诺存储在数组中,并在发送Promise.all
之前等待它们以listaEstabelecimentos
完成,它将按预期工作。
const url = `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${latitude},${latitude}&radius=200&type=store&key=${GOOGLE_PLAY_API}`;
const listaEstabelecimentos = [];
axios
.get(url)
.then(response => {
let resultados = response.data.results;
const promises = [];
if (resultados.length == 0) {
return resposta.status(404).send("Nenhum resultado encontrado pela API");
} else {
resultados.forEach((item, i) => {
let found = item.types.some(
r => tipos_estabelecimentos.indexOf(r) >= 0
);
if (found) {
var _estabelecimento = new Estabelecimento({
_id: item.place_id,
nome: item.name,
localizacao: {
type: "Point",
coordinates: [
item.geometry.location.lng,
item.geometry.location.lat
]
}
});
promises.push(
Estabelecimento.findById(_estabelecimento._id).then(result => {
if (!result || result.length == 0) {
_estabelecimento
.save()
.then(success => {
Logger.log(
"Info",
"Cadastrando novo estabelecimento: " + success
);
listaEstabelecimentos.push(success);
})
.catch(error => {
if (error) {
Logger.log(
"Erro",
"Erro ao cadastrar estabelecimento " + error
);
}
});
} else {
Logger.log(
"Info",
"Estabelecimento " +
_estabelecimento.name +
" já cadastrado. Pulando..."
);
}
})
);
}
});
}
return Promise.all(promises).then(() => {
return resposta.status(200).send(listaEstabelecimentos);
});
})
.catch(error => {
return resposta.status(500).send(error);
});