function runIdentifies(evt) { idPoint = evt.mapPoint; var layers = dojo.map(map.layerIds, function(layerId) { return map.getLayer(layerId); }); //Create an array of all layers in the map 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 dlTasks = new dojo.DeferredList(defTasks); //And use all of these Deferreds in a DeferredList dlTasks.then(showIdentifyResults); //chain showIdentifyResults onto your DeferredList for (i=0;i<tasks.length;i++) { //Use 'for' instead of 'for...in' so you can sync tasks with defTasks try { tasks.execute(params, defTasks.callback, defTasks.errback); //Execute each task } catch (e) { console.log("Error caught"); console.log(e); defTasks.errback(e); //If you get an error for any task, execute the errback } } } //needed to limit identify to only currently visible layers function createIdentifyParams(layers,evt){ 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) { idParams.layerIds = layer.visibleLayers; }else { idParams.layerIds = []; } idParams.tolerance = 3; idParams.returnGeometry = true; idParams.spatialReference = spatialReference; identifyParamsList.push(idParams); }); return identifyParamsList; } function showIdentifyResults(r) { var results = []; r = dojo.filter(r, function (result) { return r[0]; }); //filter out any failed tasks for (i=0;i<r.length;i++) { results = results.concat(r[1]); } results = dojo.map(results, function(result) { var feature = result.feature; var layerName = result.layerName; feature.attributes.layerName = result.layerName; feature.setInfoTemplate(generateInfoTemplate); var resultGeometry = feature.geometry; var resultType = resultGeometry.type; if (layerName == "House" || layerName == "Congressional" ) { feature.attributes.nameTitle = "Representative "; feature.setInfoTemplate(legisInfoTemplate); } if (layerName == "Senate") { feature.attributes.nameTitle = "Senator "; feature.setInfoTemplate(legisInfoTemplate); } return feature; }); if(results.length === 0) { map.infoWindow.clearFeatures(); } else { map.infoWindow.setFeatures(results); } map.infoWindow.show(idPoint); return results; }
function createIdentifyParams(layers,evt){ identifyParamsList.length = 0; arrayUtils.forEach(layers, function (layer) { var idParams = new IdentifyParameters(); idParams.width = app.map.width; idParams.height = app.map.height; idParams.geometry = evt.mapPoint; idParams.mapExtent = app.map.extent; idParams.layerOption = IdentifyParameters.LAYER_OPTION_VISIBLE; var visLayers = layer.visibleLayers; if (visLayers !== -1) { idParams.layerIds = layer.visibleLayers; }else { idParams.layerIds = []; } idParams.tolerance = 3; idParams.returnGeometry = true; idParams.spatialReference = spatialReference; identifyParamsList.push(idParams); }); return identifyParamsList; } function runIdentifies(evt) { idPoint = evt.mapPoint; //Create an array of all layers in the map var layers = arrayUtils.map(app.map.layerIds, function(layerId) { return app.map.getLayer(layerId); }); //Only dynamic layers have the getImageUrl function. Filter so you only query visible dynamic layers layers = arrayUtils.filter(layers, function(layer) { if (layer.visibleLayers[0] !== -1){ return layer.getImageUrl && layer.visible } }); //map each visible dynamic layer to a new identify task, using the layer url var tasks = arrayUtils.map(layers, function(layer) { return new IdentifyTask(layer.url); }); var defTasks = arrayUtils.map(tasks, function (task) { // return new dojo.Deferred(); // original code return new Deferred(); }); //map each identify task to a new dojo.Deferred //function to create an array of parameters, limits identify to only visible layers var params = createIdentifyParams(layers,evt); var dlTasks = new all(defTasks); // var dlTasks = new dojo.DeferredList(defTasks); //And use all of these Deferreds in a DeferredList, original code dlTasks.then(showIdentifyResults); for (i=0;i<tasks.length;i++) { try { tasks.execute(params, defTasks.callback, defTasks.errback); } catch (e) { console.log("Error caught"); console.log(e); defTasks.errback(e); } } } function showIdentifyResults(r) { var results = []; r = dojo.filter(r, function (result) { return r[0]; }); //filter out any failed tasks for (i=0;i<r.length;i++) { results = results.concat(r[1]); } results = arrayUtils.map(results, function(result) { var feature = result.feature; var layerName = result.layerName; feature.attributes.layerName = result.layerName; feature.setInfoTemplate(generateInfoTemplate); var resultGeometry = feature.geometry; var resultType = resultGeometry.type; if (layerName == "House" || layerName == "Congressional" ) { feature.attributes.nameTitle = "Representative "; feature.setInfoTemplate(legisInfoTemplate); } if (layerName == "Senate") { feature.attributes.nameTitle = "Senator "; feature.setInfoTemplate(legisInfoTemplate); } return feature; }); if(results.length === 0) { map.infoWindow.clearFeatures(); } else { map.infoWindow.setFeatures(results); } map.infoWindow.show(idPoint); return results; }
Solved! Go to Solution.
all(defTasks).then(showIdentifyResults);
var IdentifyTaskList = arrayUtils.map(layers, function(layer, index) { task = new IdentifyTask(layer.url); return task.execute(params[index]) //assume you have a list of identifyParameters }); all(IdentifyTaskList).then(function(Results){ //Results will be a list of Result generated by each IdentifyTask in the list })
all(defTasks).then(showIdentifyResults);
var IdentifyTaskList = arrayUtils.map(layers, function(layer, index) { task = new IdentifyTask(layer.url); return task.execute(params[index]) //assume you have a list of identifyParameters }); all(IdentifyTaskList).then(function(Results){ //Results will be a list of Result generated by each IdentifyTask in the list })
function showIdentifyResults(idResults) { generateInfoTemplate = new InfoTemplate(); generateInfoTemplate.setContent(generateWindowContent); results = arrayUtils.map(idResults, function(r) { var result = r[0]; var feature = result.feature; var layerName = result.layerName; generateInfoTemplate.setTitle("Layer Information"); feature.attributes.layerName = result.layerName; feature.setInfoTemplate(generateInfoTemplate); return feature; }); if(results.length === 0) { app.map.infoWindow.clearFeatures(); } else { app.map.infoWindow.setFeatures(results); } app.map.infoWindow.show(idPoint); // return results; }
function showIdentifyResults(idResults){
var results = [];
results = arrayUtil.map(idResults, function(r){
//loop here, something like for (i=0;i<rlength;i++??
var result = r[0]; // r might have one layer turned on, might have had several
var feature = result.feature;
var layerName = result.layerName;
generateInfoTemplate.setTitle("Layer Information");
feature.attributes.layerName = result.layerName;
feature.setInfoTemplate(generateInfoTemplate);
return feature;
if (results.length === 0) {
app.map.infoWindow.clearFeatures();
}
else {
app.map.infoWindow.setFeatures(results);
}
app.map.infoWindow.show(idPoint);
});
}
function showIdentifyResults(idResults){ var results = []; idResults = arrayUtil.filter(idResults, function (result) {//filter out any failed tasks return idResults[0]; }); for (i=0;i<idResults.length;i++) { //combines identifyResults var lyrResultLen = idResults.length; var lyrResult = idResults; for (j = 0; j < lyrResultLen; j++) { var featRes = lyrResult; results.push(featRes); } } formatResults = arrayUtil.map(results, function(result){ var feature = result.feature; var layerName = result.layerName; feature.attributes.layerName = result.layerName; feature.setInfoTemplate(generateInfoTemplate); generateInfoTemplate.setTitle("Layer Information"); return feature; }); if (formatResults.length > 0) { app.map.infoWindow.setFeatures(formatResults); app.map.infoWindow.show(idPoint); } }