В моем JavaScript-коде содержится немало асинхронных функций. Например, я использую D3.JS для чтения CSV-файла, и я подключаюсь к API Карт Google, чтобы найти маршруты проезда между двумя адресами.JavaScript/JQuery: лучший способ избежать вложенности асинхронных функций/анонимных функций обратного вызова
Я использую this answer в StackOverflow, чтобы дождаться завершения асинхронной функции (чтобы избежать возвратных переменных с значением undefined
). Тем не менее, потому что у меня много асинхронных функций, у меня есть много вложенных анонимных функции обратного вызова:
carDirections(from, to).done(function(car) {
transitDirections(from, to).done(function(train) {
// carDirections and trainDirections have similar anonymous callback functions.
function carDirections(from, to) {
var dfd = $.Deferred();
var directionsService = new google.maps.DirectionsService;
directionsService.route({
origin: from,
destination: to,
travelMode: google.maps.TravelMode.DRIVING
}, function(response, status) {
if (status === google.maps.DirectionsStatus.OK) {
dfd.resolve(response.routes[0].legs[0]);
}
});
return dfd.promise();
}
// Similar code for transitDirections.
Это приводит к спагетти из done
и Deferred
функций, что делает код очень трудно понять. Есть ли правильный способ решить эту проблему? Например, можно ли перепрограммировать функции Google Maps, чтобы сделать их синхронными, или есть другой (более простой) способ продолжать выполнение кода, когда предыдущая функция вернула переменную?
У вас есть обещания? – blessenm
@blessenm Да, это то, что я пытаюсь в сообщении выше. Это приводит к большому вложенности обещаний, и мне было интересно, можно ли этого избежать. –