I need to perform buffer search for multiple layers in my project. Consider that user is selecting layer and entering radius/uom on the form.
I am doing it following way but due to multiple asynchronous requests, I am not sure how to track querytask request in the callback function. In the following example, I want to know which layer's request has been completed in executeEquipmentSearch. Can we identify that while sending multiple async requests? Is there any alternative in such scenarios?
for (var i = 1; i <= vBufferRows; i++) {
//query task - constructing map service url for the layer
vQueryTask = QueryTask(vMapServiceUrl + '/' + findLayerId(searchParams['bufflayer' + i]));
//gis query
vQuery = new Query();
vQuery.where = 'OBJECTID IN (' + searchParams['objectid'] + ')';
vQuery.returnGeometry = true;
vQuery.outFields = ['*'];
//execute query
vQueryTask.execute(vQuery, executeEquipmentSearch);
}
function executeEquipmentSearch(response) {
var vFeatures = response.features;
for (var j = 0, len = vFeatures.length; j < len; j++) {
//Need to perform buffer search here based on the radius/uom entered on form along with the layer.
}
}
What you'll want to do is use the dojo/promise/all. This executes multiple tasks and, when they are all complete, returns an object with the results of the tasks in the same order as the tasks were originally supplied. The code below shows an example using IdentifyTask on multiple services.
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!--The viewport meta tag is used to improve the presentation and behavior of the samples on iOS devices--> <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"> <title>Identify with Popup</title> <link rel="stylesheet" href="http://js.arcgis.com/3.8/js/esri/css/esri.css"> <style> html, body, #map { height: 100%; width: 100%; margin: 0; padding: 0; } </style> <script>var dojoConfig = { parseOnLoad: true };</script> <script src="http://js.arcgis.com/3.8/"></script> <script> var map; var identifyTask, identifyParams, idPoint; var identifyResults; require([ "esri/map", "esri/dijit/Popup", "dojo/promise/all", "dojo/domReady!" ], function ( Map, Popup, All ) { var popup = new Popup({ fillSymbol: new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25])) }, dojo.create("div")); map = new Map("map", { basemap: "satellite", center: [-83.275, 42.573], zoom: 18, infoWindow: popup }); dojo.connect(map, "onLoad", mapReady); var landBaseLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/BloomfieldHillsMichigan/Parcels/MapServer", { opacity: .55 }); map.addLayer(landBaseLayer); var militaryLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Military/MapServer", { opacity: .55 }); map.addLayer(militaryLayer); console.log(militaryLayer.declaredClass); function mapReady(map) { dojo.connect(map, "onClick", runIdentifies); } function runIdentifies(evt) { identifyResults = []; idPoint = evt.mapPoint; var layers = dojo.map(map.layerIds, function (layerId) { return map.getLayer(layerId); }); layers = dojo.filter(layers, function (layer) { if (layer.visibleLayers[0] !== -1) { return layer.getImageUrl && layer.visible } }); //Only dynamic layers have the getImageUrl function. Filter so you only query visible dynamic layers var tasks = dojo.map(layers, function (layer) { return new esri.tasks.IdentifyTask(layer.url); }); //map each visible dynamic layer to a new identify task, using the layer url var defTasks = dojo.map(tasks, function (task) { return new dojo.Deferred(); }); //map each identify task to a new dojo.Deferred var params = createIdentifyParams(layers, evt); var promises = []; for (i = 0; i < tasks.length; i++) { promises.push(tasks.execute(params)); //Execute each task } var allPromises = new All(promises); allPromises.then(function (r) { showIdentifyResults(r, tasks); }); } function showIdentifyResults(r, tasks) { var results = []; var taskUrls = []; r = dojo.filter(r, function (result) { return r[0]; }); for (i = 0; i < r.length; i++) { results = results.concat(r); for (j = 0; j < r.length; j++) { taskUrls = taskUrls.concat(tasks.url); } } results = dojo.map(results, function (result, index) { var feature = result.feature; var layerName = result.layerName; var serviceUrl = taskUrls[index]; feature.attributes.layerName = result.layerName; var template = new esri.InfoTemplate("", "Service Url: " + serviceUrl + "<br/><br/>Layer name: " + result.layerName + "<br/><br/> Object Id: ${OBJECTID}"); feature.setInfoTemplate(template); var resultGeometry = feature.geometry; var resultType = resultGeometry.type; return feature; }); if (results.length === 0) { map.infoWindow.clearFeatures(); } else { map.infoWindow.setFeatures(results); } map.infoWindow.show(idPoint); return results; } function createIdentifyParams(layers, evt) { var identifyParamsList = []; identifyParamsList.length = 0; dojo.forEach(layers, function (layer) { var idParams = new esri.tasks.IdentifyParameters(); idParams.width = map.width; idParams.height = map.height; idParams.geometry = evt.mapPoint; idParams.mapExtent = map.extent; idParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_VISIBLE; var visLayers = layer.visibleLayers; if (visLayers !== -1) { var subLayers = []; for (var i = 0; i < layer.layerInfos.length; i++) { if (layer.layerInfos.subLayerIds == null) subLayers.push(layer.layerInfos.id); } idParams.layerIds = subLayers; } else { idParams.layerIds = []; } idParams.tolerance = 3; idParams.returnGeometry = true; identifyParamsList.push(idParams); }); return identifyParamsList; } }); </script> </head> <body> <div id="map"></div> </body> </html>