功能将被忽略,仅在地图末尾触发

时间:2018-07-01 22:01:04

标签: javascript reactjs react-native

我的函数遇到一些问题,问题是直到地图末尾所有的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);
}

1 个答案:

答案 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);
  });