Названия городов вышли из строя во время обратного геокодирования с использованием карт API в цикле for - PullRequest
0 голосов
/ 03 октября 2018

Я выполняю обратное геокодирование набора координат с использованием цикла for и сохраняю результат каждой итерации в массиве на node.js.Однако, когда я отправляю массив в мой угловой интерфейс или регистрирую его в консоли, порядок городов рандомизируется.Я использую обертку @ google / maps для node.js.Вот мой код:

var gm = require('@google/maps').createClient({
    key: '**********************************'
});
var x, z;
var places = [];
gm.directions({
origin: 'NYC',
destination: 'Washington DC',
}, function(err, response) {
    if (!err) {
        for(i=0; i<response.json.routes[0].legs[0].steps.length; i=i+3) {
            x = response.json.routes[0].legs[0].steps[i].end_location; //getting the coordinates of the end location for each step
            gm.reverseGeocode({latlng: [x.lat, x.lng],}, function(err, response){
                if (!err) {
                    z = response.json.results[4].address_components[1].long_name + ', ' + response.json.results[4].address_components[2].short_name;
                    places.push(z);

                }
            });

        }
    }
});
setTimeout(() => {
    console.log(places);
}, 5000)

Буду очень признателен, если вы скажете мне, что я делаю здесь неправильно.Спасибо.

ОБНОВЛЕНИЕ:

результат console.log (response.json.results [4]) результат console.log (g)

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

войдите в цикл for и проверьте итерацию (i = i + 3)

0 голосов
/ 03 октября 2018

Перво-наперво, когда вы работаете с асинхронным кодом, вы не должны полагаться на setTimeout при получении значения.Иногда timeout будет недостаточно, и вы получите неправильные данные.

Вы можете использовать решения callbacks, async/await и Promises для обработки асинхронных операций и обеспечения правильности данных.

Получение вашего примера:

let gm = require("@google/maps").createClient({
  key: "**********************************",
  Promise: Promise
});

let x, z;
let places = [];

const directionsPromise = gm
  .directions({
    origin: "NYC",
    destination: "Washington DC"
  })
  .asPromise()
  .then(response => {
    let geocodePromises = [];

    for (i = 0; i < response.json.routes[0].legs[0].steps.length; i = i + 3) {
      x = response.json.routes[0].legs[0].steps[i].end_location;

      gecodePromises.push(
        gm.reverseGeocode({ latlng: [x.lat, x.lng] }).asPromise()
      );
    }

    return Promise.all(geocodePromises);
  })
  .then(geocodes => {
    return geocodes.map(g => {
      return (
        g.json.results[4].address_components[1].long_name +
        ", " +
        g.json.results[4].address_components[2].short_name
      );
    });
  })
  .catch(err => console.error(err));


directionsPromise.then(geocodes => {
    // if you need
    places = geocodes;

    console.log(geocodes);
})

Надеюсь, это поможет.

...