2014-07-25 5 views
0

Мне нужно перебрать ответ AJAX и выйти из обработчика события, когда выполняется условие. У меня возникли проблемы с этим кодом:

$.each(response, function(i, v) { 

    // create mapbox object 
    var map = L.mapbox.map('map', v.map_embed_id, { 
     zoomAnimation: false 
    }); 

    var polygonLayer = L.mapbox.featureLayer().loadURL('https://a.tiles.mapbox.com/v4/' + v.map_embed_id + '/features.json?access_token=abcde').addTo(map); 

    polygonLayer.on('ready', function() { 
     var layer = leafletPip.pointInLayer(latlng, polygonLayer, true); 

     if (layer.length) { 
      // this is where I need to break out of $.on 
      // and the current $.each iteration 
     } 
    }); 
}); 

Я знаю return false бы вырваться из $.each итерации, но это гораздо сложнее, так как мне нужно выйти из обработчика $.on событий. Что я могу сделать? Могу ли я использовать trigger?

+2

Вы уверены, что вам нужно связать событие для каждой итерации 'each'? Это выглядит немного подозрительным, и, вероятно, я бы занялся этим. – Utkanos

+0

может использовать [прекращение распространения] (http://api.jquery.com/event.stopimmediatepropagation/) для обработчика событий и 'return false' для каждого –

+0

Почему вы привязываете готовое событие? Как вы думаете, что он делает? –

ответ

0

Благодаря совету @Kevin B, чтобы использовать рекурсию, вот как я исправил свой код, чтобы он работал.

getMapsList().done(function(maps) { 
    getMapboxMap(maps, geocode); 
}); 

function getMapboxMap(maps, geocode) { 

    var map_params = maps[0]; 
    var map_embed_id = map_params.map_embed_id; 

    if (maps.length > 0) 
     maps.shift(); 

    // create mapbox object 
    var map = L.mapbox.map('map', map_embed_id, { 
     zoomAnimation: false 
    }); 

    // create marker of address entered 
    L.mapbox.featureLayer({ 
     type: 'Feature', 
     geometry: { 
      type: 'Point', 
      coordinates: [ 
       geocode.location.lng, 
       geocode.location.lat 
      ] 
     }, 
     properties: { 
      title: address, 
      'marker-size': 'medium', 
      'marker-color': '#f44', 
      'marker-symbol': 'star' 
     } 
    }).addTo(map); 

    // create polygon layer and add to map from map's geojson 
    var polygonLayer = L.mapbox.featureLayer().loadURL('https://a.tiles.mapbox.com/v4/' + map_embed_id + '/features.json?access_token=pk.eyJ1IjoiZW5nbGVzaWRldGVycml0b3JpZXMiLCJhIjoiekFIU0NlayJ9.rE9XdicgXc9aIiXJ9yn68w').addTo(map); 

    // after polygon layer has been added to map 
    polygonLayer.on('ready', function() { 

     // featureLayer.getBounds() returns the corners of the furthest-out markers, 
     // and map.fitBounds() makes sure that the map contains these. 
     map.fitBounds(polygonLayer.getBounds()); 

     // create a latLng object based on lat/lng of address entered 
     var latlng = L.latLng(geocode.location.lat, geocode.location.lng); 

     // create point in layer object 
     var layer = leafletPip.pointInLayer(latlng, polygonLayer, true); 

     if (layer.length) { 
      // found it 
      return false; 
     } else { 
      if (maps.length > 0) { 
       getMapboxMap(maps, geocode); 
      } 
     } 
    }); 
} 

function getMapsList() { 
    return $.get('/utility/territories/maps-list'); 
} 
Смежные вопросы