Javascript возвращает XMLHttpRequest последовательно - PullRequest
0 голосов
/ 25 мая 2019

Я отправляю запрос в службу маршрутизации, которая возвращает сводку маршрута в виде json (путевые точки, расстояние, время и т. Д.).Я делаю это в цикле, потому что мне нужно вычислить несколько корней и получить их расстояния для массива.Я понимаю, что JS работает асинхронно, и если я отправляю, например, два запроса, я могу получить результат от второго запроса быстрее, чем от первого.Но есть ли способ заставить его работать так: «отправлено req1, получено результат от req1, отправлено req2, получено от req2 и т. Д.»?Я читал об установке асинхронного параметра false, но 1-й: он не работал, 2-й: как я вижу, это не очень хорошая практика.Вот мой код:

coords -- array with coordinates like [[lat0, lng0], [lat1, lng1]...]
distances -- array where I want to put distances between points

//function to get summary of one route 
function getRoutSummary(i, j) {
                var url = 'https://api.mapbox.com/directions/v5/mapbox/driving/' +
                        coords[i][1] + ',' + coords[i][0] + ';' +
                        coords[j][1] + ',' + coords[j][0] +
                        '?geometries=geojson&access_token=my api key';

                var req = new XMLHttpRequest();

                req.responseType = 'json';

                req.open('GET', url, true);

                req.onload = function () {
                    var jsonResponse = req.response;
                    var distance = jsonResponse.routes[0].distance;
                    console.log('Distance between ' +
                        'coords[' + i  +'][1]' + ',' + 'coords[' + i + '][0]' + ' and ' +
                        'coords[' + j  +'][1]' + ',' + 'coords[' + j + '][0]' +
                        ' is ' + distance);
                    distances.push(distance);
                };
                req.send();
        }

//function to get all distances. Console.log just to make me comfortable
function getAllRoutes(){
            console.log('Begin getAllRoutes');
            for (var i = 0; i < coords.length; i++){
                for (var j = 0; j < coords.length; j++){
                    getRoutSummary(i, j);
                }
            }
            console.log(distances);
        }

Так что теперь, если у меня есть три точки p1, p2, p3, я хочу получить массив с расстояниями между ними в таком порядке: [p1p1, p1p2, p1p3, p2p1, p2p2...], но этот код дает мне другой порядок всехвремя как [p1p3, p2p1, p3p2..] или [p3p3, p2p1..].Я подумал об использовании обратного вызова, но не понял, как использовать его здесь честно.Есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...