Дождитесь завершения выполнения функции, прежде чем продолжить в машинописи - PullRequest
0 голосов
/ 04 марта 2020

У меня есть функция, которая вычисляет маршрут между двумя точками.

 public ClosestPoint(waypoint,currentLocation){
     let distances = [];
     for(var i=0; i< waypoint.length;i++){
         debugger

         var rWP1 = new L.Routing.Waypoint;
         rWP1.latLng = currentLocation;    

         var rWP2 = new L.Routing.Waypoint;
         rWP2.latLng = waypoint[i];   

         var myRoute =L.Routing.mapbox('access-token');
         myRoute.route([rWP1, rWP2], function(err, routes) {
             debugger
             var distance = routes[0].summary.totalDistance;
             distances.push(distance);
         });
     }  
     var minDistance=Math.min.apply(Math, distances)
     console.log("distances "+distances);
 }

Но проблема, с которой я столкнулся, заключается в том, что myRoute.route () функция выполняется после ClosestPoint () выполнение, поэтому я не могу правильно определить расстояние. Я хочу, чтобы myRoute.route () выполнялся внутри for-l oop, а затем начинается следующая итерация.

Возможно ли это? Если да, то как? Или есть какое-то другое решение?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Попробуйте обернуть эту функцию внутри Обещание Объект

  function get_routes(rWP1,rWP2) {
    return new Promise((resolve, reject) => {
      myRoute.route([rWP1, rWP2], function (err, routes) {
        if (err) {
          reject(err);
        } else {
          resolve(routes)
        }
      });
    })
  }

и после этого вы можете использовать await внутри функции asyn c или вы можете создать массив объектов обещаний и использования Promise.all

0 голосов
/ 04 марта 2020

Мы проясним одну вещь. Любая функция с обратным вызовом в javascript не будет синхронной. Итак, вам нужно использовать async для этого.

async.eachSeries(waypoint, function(item, nextitem) {
    async.waterfall([
         function(callback) {
             var rWP1 = new L.Routing.Waypoint;
             rWP1.latLng = currentLocation;    
             var rWP2 = new L.Routing.Waypoint;
             rWP2.latLng = item;
             callback(null, [rWP1, rWP2]);
         },
         function(data, callback) {
             myRoute.route([rWP1, rWP2], function(err, routes) {
                  var distance = routes[0].summary.totalDistance;
                  distances.push(distance);
                  if(distances.length === waypoint.length){
                      var minDistance=Math.min.apply(Math, distances)
                      console.log("distances "+distances);
                  } else {
                      callback(null, 3); //3 is just a random value you can give
                  } 
             });
         }
    ],nextitem)         
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...