console.log("execution order"); console.log("1"); dojo.forEach(loadedServices, function(service) { mapService = map.getLayer(service); layerids.length = 0; //reset layerids array if (mapService.visibleLayers.length > 0) { //does service have visible layers? url = mapService.url; //get url of service identifyTask = new esri.tasks.IdentifyTask(url); //ceate new identify task identifyParams.layerIds = mapService.visibleLayers; //other params set in init function //var idDeferred = identifyTask.execute(identifyParams); //tried using return deferred object //idDeferred.then(function(idResults) { //results the same, not right approach identifyTask.execute(identifyParams, function(idResults) { //populate object for service and visible layers if (idResults.length>0) { console.log("2"); //execution order, understand it is async cp = new dijit.layout.ContentPane ({ //create a new tab for each service results title: service, style: "height:100px; width: 300px; color:#000000 background-image:none;background-color:transparent;" }); addToCP(idResults); //process results into contentPane tc.addChild(cp); //add contentPane to tab container console.log(tc.hasChildren()); //is true.... } }, function(err) { console.log("doIdentify: (" + err.name + ") " + err.message); }); } }); console.log("3"); console.log(tc); if (tc.hasChildren()) { //is always false due to tc.startup(); map.infoWindow.setContent(tc.domNode); map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint)); } else { alert('No results found, please check layer visibility and try again.'); }
//thanks David for help on handling tracking of callback completion var callback_counter=0; var expected_callback_counter=0; dojo.forEach(loadedServices, function(service) { mapService = map.getLayer(service); if (mapService.visibleLayers.length > 0) { expected_callback_counter++; //every visible layer should produce a callback, even if no results } }); //for each loaded non-base layer service dojo.forEach(loadedServices, function(service) { mapService = map.getLayer(service); //get service object layerids.length = 0; if (mapService.visibleLayers.length > 0) { //does service have visible layers? showLoading(); url = mapService.url; //get url of service identifyTask = new esri.tasks.IdentifyTask(url); //ceate new identify task identifyParams.layerIds = mapService.visibleLayers; //set layers to identify identifyTask.execute(identifyParams, function(idResults) { //callback function - fires for each visible layer if (idResults.length>0) { //create tab for service if results returned cp = new dijit.layout.ContentPane ({ title: service, style: "height:150px; width: 400px; color:#000000 background-image:none;background-color:transparent;" }); //dojo.forEach (allResults, function(result) {allResults.push(result)}); //may use different display, need allResults at once addToMap(idResults); //process results into containter content tc.addChild(cp); } callback_counter++; //a callback has fired - count them if (callback_counter == expected_callback_counter) { if (tc.hasChildren()) { //may have no results across all services tc.startup(); map.infoWindow.setContent(tc.domNode); hideLoading(); map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint)); //addToMap2(allResults); } else { alert('No results found!'); } } }, function(err) { //error callback console.log("doIdentify: (" + err.name + ") " + err.message); }
Even though this is an old post, I just want to say how much it helped me today. Absolutely outstanding! I did have to massage this code lightly to get it to work. I added some logic to only identify visible map service layers. Also, rather than creating a custom content box for the response, I was able to use map.infoWindow setFeatures and show methods to use the default map info window. Additionally, I tied it all to a map click event. Of course, I will need to take additional time to format info Templates for each layer. Here is my code:
map.on("click", function (event) {
//Identify tasks
let identifyParams = new IdentifyParameters();
identifyParams.tolerance = 3;
identifyParams.returnGeometry = true;
identifyParams.width = map.width;
identifyParams.height = map.height;
identifyParams.mapExtent = map.extent;
identifyParams.geometry = event.mapPoint;
let callback_counter = 0;
let expected_callback_counter = 0;
dojo.forEach(loadedMapServices, function (service) {
let mapService = map.getLayer(service);
if (mapService.visibleLayers.length > 0) {
expected_callback_counter++; //every visible layer should produce a callback, even if no results
}
});
//for each loaded non-base layer service
let deferred = [];
dojo.forEach(loadedMapServices, function (service) {
let mapService = map.getLayer(service); //get service object
if (mapService.visible) {
if (mapService.visibleLayers.length > 0) { //does service have visible layers?
// showLoading();
let url = mapService.url; //get url of service
let identifyTask = new IdentifyTask(url); //ceate new identify task
identifyParams.layerIds = mapService.visibleLayers; //set layers to identify
let deferred_idTask = identifyTask
.execute(identifyParams)
.addCallback(function (response) {
// response is an array of identify result objects
// Let's return an array of features.
return arrayUtils.map(response, function (result) {
let feature = result.feature;
let desc = result.layerName;
console.log(feature);
let Template = new InfoTemplate(desc, "${*}");
feature.setInfoTemplate(Template);
return feature;
});
});
deferred.push(deferred_idTask);
}
}
});
map.infoWindow.setFeatures(deferred);
map.infoWindow.show(event.mapPoint);
});
});