2017-07-20 38 views
1

私はちょっと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()関数がすべてのルートを準備するまで待つことです。助けてください!

答えて

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(); 
関連する問題