@Leopandro
Разработчик CRM/ERP систем

Как заставить выполнить js функцию, которая в свою очередь вызывает callback функцию асинхронно?

Есть функция в ts(js)
calculateAndDisplayRoute(callback) {
    var waypts = [];
    return this.directionsService.route({
      origin: "Аэропорт, Республика Башкортостан, Россия",
      destination: $('#address_to').val(),
      waypoints: waypts,
      optimizeWaypoints: true,
      travelMode: 'DRIVING'
    }, (response, status) => {
      callback(response, status);
    });
  }

она НИЧЕГО не возращает,
далее вызываю функцию примерно так
var result = '';
                          this.calculateAndDisplayRoute((response, status) => {
                            console.log(status);
                            result = status;
                            if (status === 'OK') {
                              // marker.setMap(null);
                              this.directionsDisplay.setDirections(response);
                              return true;
                              } else {
                                return true;
                              }
                          });
                          console.log(result);

Сначала, кончено же выполнится последняя строчка console.log(result);, и только потом console.log(status); Что нужно добавить чтоб вызвать функцию асинхронно?
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Вы что-то путаете, либо не понимаете чем отличаются понятия синхронно и асинхронно. Функция итак выполняется асинхронно, поэтому выполнение продолжается до ее завершения, иначе бы вызов console.log(result) происходил в конце. Вызывайте console.log(result) в колбеке, это самый оптимальный вариант.
Если все-таки хотите вызывать по порядку, то используйте async/await.
Для этого сделайте обертку над своей функцией:
const calculateAndDisplayRoute = callback => new Promise((resolve, reject) => {
    var waypts = [];
    return this.directionsService.route({
      origin: "Аэропорт, Республика Башкортостан, Россия",
      destination: $('#address_to').val(),
      waypoints: waypts,
      optimizeWaypoints: true,
      travelMode: 'DRIVING'
    }, (response, status) => {
      if (status === 'OK') {
         resolve(callback(response, status));
      } 
      reject(status);
    });
});

и вызывайте все это дело в асинхронной функции:
async function run() {
  try {
    await calculateAndDisplayRoute((response, status) => {
      console.log(status);
      result = status;
      this.directionsDisplay.setDirections(response);
      return true;
    });
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

Вместо колбеков удобней использовать промисы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы