Как мне дождаться завершения всех обещаний, прежде чем выполнять функцию ABCD в Javascript? - PullRequest
0 голосов
/ 08 февраля 2019

Я создаю новое Обещание каждый раз, когда запрашиваю расстояние от Google API.Я хочу разрешить все обещания, а затем вызвать функцию ABCD?Прямо сейчас он вызывает функцию ABCD.

async function RunBookings(Records) {
  for (var k = 0; k < gDestinationsArray.length; k++) {
    console.log('k' + k);
    let promise = new Promise(function(resolve, reject) {
      console.log('new Promise');
      var DistanceService = new google.maps.DistanceMatrixService();
      DistanceService.getDistanceMatrix({
        origins: gOriginsArray[k],
        destinations: gDestinationsArray[k],
        travelMode: google.maps.TravelMode.DRIVING,
        unitSystem: google.maps.UnitSystem.METRIC,
        avoidHighways: false,
        avoidTolls: false
      }, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
          console.log(response);
          var results = response.rows[0].elements; //console.log(results );
          for (var l = 0; l < results.length; l++) {
            gDistanceArray.push(results[l].distance.text);
          }
          setTimeout(function() {
            resolve('Good promise');
          }, 10000);
        } else if (status === google.maps.DirectionsStatus.OVER_QUERY_LIMIT) {
          console.log('OVER_QUERY_LIMIT');
          console.log(response);
          console.log(status);
          reject(Error("Bad promise"));
        } else {
          console.log('BAD');
          console.log(response);
          console.log(status);
          reject(new Error("Bad promise"));
        }
      });
    });
    let result = await promise;
  }
}

function ABCD() {

}

RunBookings(Records);
ABCD();

Ответы [ 2 ]

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

Вы должны дождаться всех обещаний с Promise.all (обещания)

function RunBookings(Records) {
  const promises = [];

  for (var k = 0; k < gDestinationsArray.length; k++) {
    let promise = new Promise(function(resolve, reject) {

    ..... your code....

    promises.push(promise);
  }

  return promises;
}

function ABCD() {
}


Promise.all(RunBookings(Records))
   .then( val => {
       ABCD();
   });

или с асинхронным ожиданием

async function RunBookings(Records) {
  const promises = [];

  for (var k = 0; k < gDestinationsArray.length; k++) {
    let promise = new Promise(function(resolve, reject) {

    ..... your code....

    promises.push(promise);
  }

  return promises;
}

function ABCD() {
}


let result = await RunBookings(Records);
ABCD();

или если вы хотите вернуть одно обещание

async function RunBookings(Records) {
  await Promise.all(gDestinationArray.map(async (gDestination) => {
           ............
  }));
}

RunBookings(Records);
ABCD();
0 голосов
/ 08 февраля 2019

RunBookings является async function и поэтому возвращает обещание (оно не блокирует!), Поэтому используйте

RunBookings(Records).then(ABCD);
...