I have found a way to do this, I haven't had any issues yet. I did this within a report widget . The onSubscribe function runs within the widgets onOpen function. The function to turn layers back on runs after report w/map is created. The DWclick topic runs the doWork() function.
postCreate: function() {
this.inherited(arguments);
this.own(topic.subscribe("DWclick", lang.hitch(this, this.doWork)));
this.own(topic.subscribe("FRclick", lang.hitch(this, this.finReport)));
},
onOpen: function () {
this.onSubscribe();
setTimeout(function() {topic.publish('DWclick');}, 6000);
},
doWork: function () {
setTimeout(function() {topic.publish('FRclick');}, 3000);
}
onSubscribe: function() {
var extent = this.map.extent
layerlist=[];
LayerInfos.getInstance(this.map, this.map.itemInfo, extent).then(function(layerInfosObject){
layerInfosObject.traversal(function(layerInfo) {
if (layerInfo._visible) {
if(layerInfo.title!=="QV_Utility" && layerInfo.title!=="Ticket Symbols" && layerInfo.title!=="Closed Tickets" && layerInfo.title!=="Emergency Tickets" && layerInfo.title!=="Open Tickets" ){
var fullrl = layerInfo.layerObject.url;
var qt = new QueryTask(fullrl);
var query = new Query();
query.returnGeometry = false;
var OIDfield = layerInfo.layerObject.objectIdField;
query.where = "1=1";
query.geometry = extent;
var countDef = layerInfo.layerObject._currentDef = qt.executeForCount(
query,
lang.hitch(layerInfo.layerObject, function(results) {
if (results){
return results;
}
else{
if (results==0) {
layerInfo.setTopLayerVisible(false);
layerlist.push(layerInfo.title);
}
}
})
);
}
}
});
});
this.layerlist= layerlist;
return this.layerlist;
PanelManager.getInstance().closePanel('_31_panel');
},
finReport: function(layerlist) {
console.log("FINREPORT",this.layerlist);
LayerInfos.getInstance(this.map, this.map.itemInfo).then(function(layerInfosObject){
layerInfosObject.traversal(function(layerInfo) {
if (this.layerlist.includes(layerInfo.title)){
layerInfo.setTopLayerVisible(true);
}
});
});
},