Последовательность обратных вызовов от Google DistanceMatrix
Предыстория: у меня есть 2 источника, 2 пункта назначения и 2 разных времени отправления:
1) A->B (start-time: X)
2) C->D (start-time: Y)
Я также рассчитываю получить время от B до C и от D до A, причем эти времена отправления являются динамическими: вычисляются после того, как был выполнен первый путь путешествия.
3) B->C (start-time: X+p)
4) D->A (start-time: Y+q)
В основном, необходимо выполнить 1) и 2), прежде чем 3) и 4) могут быть выполнены. Кроме того, мне нужны эти результаты в точном порядке: 1,2,3,4.
Я не слишком знаком с обратными вызовами, и я не нашел никого другого, имеющего этот тип проблемы, поэтому любая помощь приветствуется. В настоящее время я понял, что по крайней мере 1 и 2 выполняются до 3 и 4, но из-за асинхронности обратные вызовы отвечают в произвольном порядке + иногда 3 и 4 равны.
JS код:
$(function () {
var date = new Date();
date.setDate(date.getDate() + 7);
var DrivingOptions = {};
var hours, mins, hours2, mins2, origin1, origin2, origin3, origin4, dest1, dest2, dest3, dest4;
var resultCounter = 1;
$('#distance_form').submit(function (e) {
event.preventDefault();
//Following code assigns values for origins/destinations and values for initial departuretimes (taken from format hh:mm)
origin1 = dest1 = $('#sp0001').val();
dest2 = origin2 = $('#ep0001').val();
origin3 = dest3 = $('#sp0002').val();
dest4 = origin4 = $('#ep0002').val();
hours = $('#st0001').val().slice(0, 2);
mins = $('#st0001').val().slice(3, 5);
hours2 = $('#st0002').val().slice(0, 2);
mins2 = $('#st0002').val().slice(3, 5);
var duration_text = calculateDistance(origin1, dest2);
var duration_text2 = calculateDistance2(origin3, dest4);
});
function calculateDistance(origin, destination) {
var service = new google.maps.DistanceMatrixService();
date.setHours(hours);
date.setMinutes(mins);
date.setSeconds(0);
DrivingOptions = {
departureTime: date,
trafficModel: 'pessimistic'
};
service.getDistanceMatrix({
origins: [origin],
destinations: [destination],
travelMode: 'DRIVING',
drivingOptions: DrivingOptions
}, callback);
}
function calculateDistance2(origin, destination) {
var service = new google.maps.DistanceMatrixService();
date.setHours(hours2);
date.setMinutes(mins2);
date.setSeconds(0);
DrivingOptions = {
departureTime: date,
trafficModel: 'pessimistic'
};
service.getDistanceMatrix({
origins: [origin],
destinations: [destination],
travelMode: 'DRIVING',
drivingOptions: DrivingOptions
}, callback2);
}
function callback(response, status) {
if (status != google.maps.DistanceMatrixStatus.OK) {
$('#result').html(err);
} else {
var origin = response.originAddresses[0];
var destination = response.destinationAddresses[0];
var duration = response.rows[0].elements[0].duration_in_traffic;
var duration_value = duration.value;
var duration_text = duration.text;
var duration_time = duration_text.substring(0, duration_text.length);
console.log('Trip from ' + origin + ' to ' + destination + ' takes ' + duration_time + '.';
if (resultCounter < 2 || resultCounter % 2 == 1) {
var service = new google.maps.DistanceMatrixService();
date.setSeconds(duration.value);
DrivingOptions = {
departureTime: date,
trafficModel: 'pessimistic'
};
service.getDistanceMatrix({
origins: [origin2],
destinations: [dest3],
travelMode: 'DRIVING',
drivingOptions: DrivingOptions
}, callback);
}
resultCounter++;
}
}
function callback2(response, status) {
if (status != google.maps.DistanceMatrixStatus.OK) {
$('#result').html(err);
} else {
var origin = response.originAddresses[0];
var destination = response.destinationAddresses[0];
var duration = response.rows[0].elements[0].duration_in_traffic;
var duration_value = duration.value;
var duration_text = duration.text;
var duration_time = duration_text.substring(0, duration_text.length);
console.log('Trip from ' + origin + ' to ' + destination + ' takes ' + duration_time + '.';
if (resultCounter < 2 || resultCounter % 2 == 1) {
var service = new google.maps.DistanceMatrixService();
date.setSeconds(duration.value);
DrivingOptions = {
departureTime: date,
trafficModel: 'pessimistic'
};
service.getDistanceMatrix({
origins: [origin4],
destinations: [dest1],
travelMode: 'DRIVING',
drivingOptions: DrivingOptions
}, callback);
}
resultCounter++;
}
}
});