async-await не работает при экспорте матрицы расстояний Google из класса - PullRequest
0 голосов
/ 16 февраля 2019

Я использую автозаполнение мест Google и матрицу расстояний, чтобы указать два местоположения и распечатать расстояние между ними.У меня есть два класса javascript es6 для разделения API Google в качестве сервисов.

Моя проблема в том, что я пытаюсь дождаться ответа о получении расстояния от службы матрицы расстояний, а затем записать его на консоль, но при регистрации я получаю неопределенное значение.служба матрицы расстояний возвращает ответ после того, как я его запишу.Это должно означать, что мое ожидание в методе не работает.Что я делаю не так?

distanceMatrix.js

export default class DistanceMatrixService {
    constructor(pickup, dropoff, garage){
        .....
        }

    getDistance(arg1, arg2) {
        this.distance.getDistanceMatrix({
        origins: [arg1],
        destinations: [arg2],
        travelMode: 'DRIVING',
        unitSystem: google.maps.UnitSystem.IMPERIAL
      }, response => {
          console.log(response) //actually returns desired response
          return response.rows[0].elements[0].distance.text}
    );
 }

main.js

calcButton.addEventListener('click', async (event) => {
    event.preventDefault();

    const distanceMatrix = new DistanceMatrixService(pickupInfo.formatted_address, dropoffInfo.formatted_address)
    const pickup =  pickupInfo.formatted_address
    const dropoff = dropoffInfo.formatted_address

    const ptd = await distanceMatrix.getDistance(pickup, dropoff);

    console.log(ptd) // undefined
 });

Я ожидаю, что console.log (ptd) будет ожидать distanceMatrix.getDistance () для завершения, но фактические результаты ptd записываются как неопределенные, а затем console.log (response) из матрицы расстояний выходит из системы.Это должно быть наоборот.

1 Ответ

0 голосов
/ 16 февраля 2019

async / await работает с обещаниями и не будет работать с обратным вызовом.Вместо этого попробуйте следующее, вернув обещание из getDistance() и разрешив соответствующее значение из обратного вызова:

export default class DistanceMatrixService {
  constructor(pickup, dropoff, garage) { /* ... */ }

  getDistance(arg1, arg2) {
    return new Promise((resolve, reject) => {
      this.distance.getDistanceMatrix({
        origins: [arg1],
        destinations: [arg2],
        travelMode: 'DRIVING',
        unitSystem: google.maps.UnitSystem.IMPERIAL
      }, response => {
        console.log(response) //actually returns desired response
        resolve(response.rows[0].elements[0].distance.text);
      }
      );
    });
  }
}

Вам также следует рассмотреть возможность использования catch() для обработки ошибок, какнеобходимо.

Надеюсь, это поможет!

...