Как не изменить порядок моего массива в обещании - PullRequest
1 голос
/ 11 апреля 2019

В настоящее время я делаю систему маршрутизации, используя здесь-API. Я начинаю с массива указаний в тексте. Как это.

directions: [ 
        "2 Rue de l'Euron, 54320 Maxéville",
        "34 Rue Sainte-Catherine, 54000 Nancy", //aquarium
        "401 Avenue de Boufflers, 54520 Laxou", //grand frais 
        "42 Rue Kléber, 54000 Nancy", //regalo pizza
        "33/45 Avenue de Metz, 54320 Maxéville", //lidl
        "2 Rue de l'Euron, 54320 Maxéville"
    ]

Я отправляю эти направления в API здесь, чтобы указать широту и длину этих направлений. Проблема в том, что я использую обещания, и иногда эти указания возвращаются в другом порядке, но мне нужно по крайней мере первое и последнее, чтобы остаться на том же месте.

Я уже прочитал это и это . Я уже пробовал с await, но я не могу, потому что это асинхронная функция. И без обещания; но он говорит, что нуждается в обратном вызове.

Вот так я получаю свои координаты с помощью геокодера

getCoordinates(query) {
                return new Promise((resolve, reject) => {
                    this.geocoder.geocode({ searchText: query }, data => {

                        //Si il y'a une response
                        if(data.Response.View[0].Result.length > 0) {
                            data = data.Response.View[0].Result.map(location => {
                                return {
                                    address: query,
                                    lat: location.Location.DisplayPosition.Latitude + "", //.toString() marche pas 
                                    lng: location.Location.DisplayPosition.Longitude + ""
                                };

                            });
                            resolve(data);
                        }
                        //Si non
                        else {
                            reject({ "message": "No data found" });
                        }
                    }, error => {
                        reject(error);
                    });
                });
            },

И вот я пытаюсь получить их по загрузке

load(directions){
     directions.map(direction => 
         this.getCoordinates(direction).then(response => 
              console.log(response[0]))
                )

            }

Иногда у меня есть такой ответ. Не заказано

{address: "2 Rue de l'Euron, 54320 Maxéville", lat: "48.70283", lng: "6.13316"}
{address: "401 Avenue de Boufflers, 54520 Laxou", lat: "48.69347", lng: "6.13732"}
{address: "33/45 Avenue de Metz, 54320 Maxéville", lat: "48.70848", lng: "6.16666"}
{address: "2 Rue de l'Euron, 54320 Maxéville", lat: "48.70283", lng: "6.13316"}
{address: "34 Rue Sainte-Catherine, 54000 Nancy", lat: "48.69507", lng: "6.18847"}
{address: "42 Rue Kléber, 54000 Nancy", lat: "48.68373", lng: "6.16838"}

1 Ответ

2 голосов
/ 11 апреля 2019

Регистрируйте ответы только после вызова Promise.all в сопоставленных обещаниях для каждого направления:

load(directions){
  Promise.all(
    directions.map(direction => this.getCoordinates(direction))
  )
  .then((coordinates) => {
    coordinates.forEach((coordinate) => {
      console.log(coordinate);
    });
  });
}

Promise.all принимает в качестве параметра массив обещаний и разрешает в массиве каждого разрешения обещаниязначение в том же порядке, что и исходный массив - это именно то, что вам нужно.

...