Я отправляю запрос в службу маршрутизации, которая возвращает сводку маршрута в виде 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..]
.Я подумал об использовании обратного вызова, но не понял, как использовать его здесь честно.Есть предложения?