传单路由,具有多个来源的最短路径

时间:2017-07-20 19:25:28

标签: javascript asynchronous leaflet leaflet-routing-machine

我是javascript的新手,我在我建立的网站上遇到了一个问题。一点背景:我有一张传单地图,在那张地图上有多辆车。当我在地图上放置一个新标记时,系统必须计算该标记与我已经拥有的30个车辆之间的所有路线。然后它必须采取该数组的路线并按最短距离对其进行排序。 我简单地看了一下承诺,但从未设法让它正常工作。

var get_all_routes = function(){
var promise = new Promise(function(resolve,reject){
var rutas = [];
for(var i = 0;i<Object.keys(puntos).length;i++){  
  get_route(ambulance[i]).then(function(response){
  rutas.push(response);
});
}
resolve(rutas);
});
return promise;
}

救护车是一个全球阵列,地图上每辆车的位置。

function get_route(punto){
 return new Promise(function(resolve,reject){
 var waypoints = [
  L.Routing.waypoint(L.latLng(feature.getLatLng().lat, feature.getLatLng().lng)),
  L.Routing.waypoint(L.latLng(punto.getLatLng().lat,punto.getLatLng().lng)),
  ];
  var router = new L.routing.osrmv1({});
  router.route(waypoints, function(error, routes) {
  if(error==null){
        resolve(routes[0]);
  }else
    resolve('No route available');
  }, null, {}); 
 });
}

功能是放置在地图上的新标记。

var sort_cars = function(rutas) {
  var promise = new Promise(function(resolve,reject){
    rutas.sort(function(a, b){return a.summary.totalDistance-
    b.summary.totalDistance});
    resolve(rutas);
 });
  return promise;
}

根据总距离排序。

这就是我所说的:

get_all_routes().then(function(resolve){
    window.setTimeout(function() {sort_cars(resolve).then(function(resolve){
      routes = resolve;
      other_func()
      .then(other_func2(routes));
    })}, 3000);
});

other_func()和other_func2()做非重要的事情。这是有效的,直到它没有。由于超时3秒,如果路由代理需要更多的时间来获取所有路由,那么所有的地狱都会崩溃。

我需要的是sort_cars()函数要等到所有路由都准备好才能做到这一点。请帮忙!

1 个答案:

答案 0 :(得分:0)

我最后做了一些研究,发现了这个教程:

http://jingding.blogspot.cl/2012/05/jquery-deferred-objects-promise.html

并将我的代码更改为:

var get_all_routes2=function(){
   var rutas = [];
   mymap.spin(true);
   mymap._handlers.forEach(function(handler) {
    handler.disable();
   });
   var currentStep = get_route2(ambulancias[0].id_recurso,ambulancias[0],puntos[0].tipos_estados.alias2,puntos[0].disponible,puntos[0].servicio,0,rutas);
   for(var i = 1;i<Object.keys(puntos).length;i++){
    currentStep = currentStep.then(function(j){            
        return get_route2(ambulancias[j+1].id_recurso,ambulancias[j+1],puntos[j+1].tipos_estados.alias2,puntos[j+1].disponible,puntos[j+1].servicio,j+1,rutas);
     });
   }

    currentStep.done(function(){
      Promise.resolve(sort_cars2(rutas)).then(function(resolve){
      remove_ambulances();
      create_ambulances(resolve);
      mymap.spin(false);
      mymap._handlers.forEach(function(handler) {
          handler.enable();

      });
    });
  });
}

function get_route2(id,punto,alias2,disponibilidad,servicio,i,rutas){
   var defer = $.Deferred();
   var waypoints = [
     L.Routing.waypoint(L.latLng(feature.getLatLng().lat, feature.getLatLng().lng)),L.Routing.waypoint(L.latLng(punto.getLatLng().lat,punto.getLatLng().lng)),
   ];
   var router = new L.routing.osrmv1({});
   router.route(waypoints, function(error, routes) {
     if(error==null){
           rutas.push(routes[0]);
           defer.resolve(i);
     }
   }, null, {});
   return defer.promise();
}

var sort_cars2 = function(rutas) {
  var promise = new Promise(function(resolve,reject){
    rutas.sort(function(a, b){return a.summary.totalDistance-b.summary.totalDistance});
    resolve(rutas);
  });
  return promise;
}

然后,我只是使用:

来调用它
get_all_routes2();