<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Managing a deferred list of query tasks in ArcGIS JavaScript Maps SDK Questions</title>
    <link>https://community.esri.com/t5/arcgis-javascript-maps-sdk-questions/managing-a-deferred-list-of-query-tasks/m-p/220151#M20451</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;DeferredList results are little funky when you first start dealing with them. The result of a DeferredList is 2-dimensional arry (array of arrays).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;A result will look like this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
[
&amp;nbsp; [ true, { name: "I am result 1." } ],
&amp;nbsp; [ true, { name: "I am result 2." } ],
&amp;nbsp; [ true, { name: "I am result 3." } ]
]
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Each array inside the main array is a result of a deferred. If the first element in the array is true, it resolved sucessfully, if it is false, something went wrong and the second element would be the error message.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You can view the source code for DeferredList here.&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="https://github.com/dojo/dojo/blob/master/DeferredList.js#L32-L58" rel="nofollow noopener noreferrer" target="_blank"&gt;https://github.com/dojo/dojo/blob/master/DeferredList.js#L32-L58&lt;/A&gt;&lt;BR /&gt;&lt;SPAN&gt;The highlighted snippet shows how the results of a DeferredList are built.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Knowing how the results are returned from a DeferredList makes parsing the data a little easier.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In your snippet, I think if you change this bit here, it should work.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
queryResults = dojo.filter(queryResults, function (result) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // change this here, you were returning queryResults[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // result[0] would be either true or false and this filters out all false results
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result[0]; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Then the next bit of code you use to concatenate the results should work.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have this snippet of similar code that I have used to clean up the results and it's always worked for me.&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
function cleanResponse(res) {
 var i = 0,
&amp;nbsp; len = res.length,
&amp;nbsp; results = [];
 for (; i &amp;lt; len; i++) {
&amp;nbsp; // checks to see if the resolved value is true
&amp;nbsp; if (res&lt;I&gt;[0]) {
&amp;nbsp;&amp;nbsp; // concatenate the array with the resolved result
&amp;nbsp;&amp;nbsp; results = results.concat(res&lt;I&gt;[1]);
&amp;nbsp; }
 }
 // creates an array of only your results or FeatureSets
 return results;
}
&lt;/I&gt;&lt;/I&gt;&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;With that, DeferredList is now a deprecated module and it is recommended that you look at the dojo/promise/all module. The API is much cleaner to work with and doesn't involve worrying about 2-dimensional arrays.&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://dojotoolkit.org/reference-guide/1.9/dojo/promise/all.html" rel="nofollow noopener noreferrer" target="_blank"&gt;http://dojotoolkit.org/reference-guide/1.9/dojo/promise/all.html&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Hope that helps.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 11 Dec 2021 10:44:12 GMT</pubDate>
    <dc:creator>ReneRubalcava</dc:creator>
    <dc:date>2021-12-11T10:44:12Z</dc:date>
    <item>
      <title>Managing a deferred list of query tasks</title>
      <link>https://community.esri.com/t5/arcgis-javascript-maps-sdk-questions/managing-a-deferred-list-of-query-tasks/m-p/220150#M20450</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;My goal is to select a legislative district by number, using it's geometry as input to look up different features in that district. There will be lots of different layers the user can turn on/off (schools, nursing homes etc) and the query will select only those features that are currently visible within their district and create a list.&amp;nbsp;&amp;nbsp;&amp;nbsp; The query tasks must therefore be generated on the fly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am using a posted Fiddle example for a deferred list for identifytasks, modifying it for query tasks instead.&amp;nbsp; (Thanks Brett for such a great example BTW) I have made good progress up to a point, I see that each of my queries are executing.&amp;nbsp; But I'm getting bogged down in how to manage the multiple sets of results that are getting returned as output from each of the tasks.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have an empty array defined as qTaskList to hold all the query tasks needed for the current visibility.&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;
qTaskList = [];
&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In previous functions I have defined a single Query, called multiQuery that will be used for all the queryTasks I execute.&amp;nbsp; It is defined as:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;
multiQuery = new esri.tasks.Query();

&amp;nbsp;&amp;nbsp; multiQuery.outSpatialReference = map.spatialReference; 
&amp;nbsp;&amp;nbsp; multiQuery.returnGeometry = false;
&amp;nbsp;&amp;nbsp; multiQuery.spatialRelationship = esri.tasks.Query.SPATIAL_REL_CONTAINS; 
&amp;nbsp;&amp;nbsp; multiQuery.outFields = ["*"];
&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;These are supposed to generate a set of querytasks, which as put in a deferredlist and then executed.&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt; 
function runQueries(geometry) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; multiQuery.geometry = geometry;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Create an array of all layers in the map
&amp;nbsp;&amp;nbsp;&amp;nbsp; var layers = dojo.map(map.layerIds, function(layerId) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return map.getLayer(layerId);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }); 
&amp;nbsp;&amp;nbsp;&amp;nbsp; layers = dojo.filter(layers, function(layer) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return layer.getImageUrl &amp;amp;&amp;amp; layer.visible;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }); //Only dynamic layers have the getImageUrl function. Filter so you only query visible dynamic layers
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var qtasks = generateQTasks(layers);
&amp;nbsp;&amp;nbsp;&amp;nbsp; var defTasks = dojo.map(qtasks, function (task) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new dojo.Deferred();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }); //map each query task to a new dojo.Deferred
&amp;nbsp;&amp;nbsp;&amp;nbsp; var dlTasks = new dojo.DeferredList(defTasks); //And use all of these Deferreds in a DeferredList
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dlTasks.then(showQueryResults); //chain showQueryResults onto your DeferredList

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0;i&amp;lt;qtasks.length;i++) { //Use 'for' instead of 'for...in' so you can sync tasks with defTasks
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; qtasks&lt;I&gt;.execute(multiQuery, defTasks&lt;I&gt;.callback, defTasks&lt;I&gt;.errback); //Execute each task
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log("Error caught");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log(e);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; defTasks&lt;I&gt;.errback(e); //If you get an error for any task, execute the errback
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
//function used to determine which layer visibility of each ArcGISDynamicMapServiceLayer
function generateQTasks(layers) {
&amp;nbsp;&amp;nbsp; qTaskList.length = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.map(layers, function (layer){

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (layer.id !== "districtLayer") {//don't run querytasks against the layer used in the findtask, it's not needed

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var visLayers = getVisibleLayers(layer);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.forEach(visLayers, function (layerId){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var qTask = new esri.tasks.QueryTask(layer.url+"/"+layerId);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; qTaskList.push(qTask);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
}
});
&amp;nbsp;&amp;nbsp;&amp;nbsp; return qTaskList;
}

function getVisibleLayers(myLayer) {&amp;nbsp;&amp;nbsp;&amp;nbsp; 
var visibleLayers = [];
&amp;nbsp;&amp;nbsp;&amp;nbsp; var items = dojo.map(myLayer.layerInfos, function (info, index) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; layerID = info.id;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (info.visible &amp;amp;&amp;amp; !info.subLayerIds) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; visibleLayers.push(layerID)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }); 
&amp;nbsp;&amp;nbsp;&amp;nbsp; return visibleLayers;
}

&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;SPAN&gt;This is where I start to get lost.&amp;nbsp; I've added break points and it does look that I have an array, successResults, each of which is a featureSet (I think!).&amp;nbsp; But when I try to process these individually, it only seems to process the first featureSet, not all of them.&amp;nbsp; I know I also have issues in the next function, queryGeometryResultsHandler_toGrid, which is supposed to generate a titlePane in a div for each out the ouput.&amp;nbsp; Probably that will be a whole other thread!&amp;nbsp; For now all I'm trying to do is properly deal with my array of featureSets.&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;
function showQueryResults (queryResults) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var successResults = [];
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResults = dojo.filter(queryResults, function (result) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return queryResults[0];
&amp;nbsp;&amp;nbsp;&amp;nbsp; }); //filter out any failed tasks
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0;i&amp;lt;queryResults.length;i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; successResults = successResults.concat(queryResults&lt;I&gt;[1]);//these are all the successful querytasks
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
 numberQueryTasks = successResults.length;
//need to process each set of query results
&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.forEach(successResults, function(taskResults) {
 console.log("within dojo foreach of successResults");
&amp;nbsp; queryGeometryResultsHandler_toGrid(taskResults);
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
 
}
&lt;/I&gt;&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 08 Aug 2013 19:38:03 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-javascript-maps-sdk-questions/managing-a-deferred-list-of-query-tasks/m-p/220150#M20450</guid>
      <dc:creator>TracySchloss</dc:creator>
      <dc:date>2013-08-08T19:38:03Z</dc:date>
    </item>
    <item>
      <title>Re: Managing a deferred list of query tasks</title>
      <link>https://community.esri.com/t5/arcgis-javascript-maps-sdk-questions/managing-a-deferred-list-of-query-tasks/m-p/220151#M20451</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;DeferredList results are little funky when you first start dealing with them. The result of a DeferredList is 2-dimensional arry (array of arrays).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;A result will look like this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
[
&amp;nbsp; [ true, { name: "I am result 1." } ],
&amp;nbsp; [ true, { name: "I am result 2." } ],
&amp;nbsp; [ true, { name: "I am result 3." } ]
]
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Each array inside the main array is a result of a deferred. If the first element in the array is true, it resolved sucessfully, if it is false, something went wrong and the second element would be the error message.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You can view the source code for DeferredList here.&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="https://github.com/dojo/dojo/blob/master/DeferredList.js#L32-L58" rel="nofollow noopener noreferrer" target="_blank"&gt;https://github.com/dojo/dojo/blob/master/DeferredList.js#L32-L58&lt;/A&gt;&lt;BR /&gt;&lt;SPAN&gt;The highlighted snippet shows how the results of a DeferredList are built.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Knowing how the results are returned from a DeferredList makes parsing the data a little easier.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In your snippet, I think if you change this bit here, it should work.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
queryResults = dojo.filter(queryResults, function (result) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // change this here, you were returning queryResults[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // result[0] would be either true or false and this filters out all false results
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result[0]; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Then the next bit of code you use to concatenate the results should work.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have this snippet of similar code that I have used to clean up the results and it's always worked for me.&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
function cleanResponse(res) {
 var i = 0,
&amp;nbsp; len = res.length,
&amp;nbsp; results = [];
 for (; i &amp;lt; len; i++) {
&amp;nbsp; // checks to see if the resolved value is true
&amp;nbsp; if (res&lt;I&gt;[0]) {
&amp;nbsp;&amp;nbsp; // concatenate the array with the resolved result
&amp;nbsp;&amp;nbsp; results = results.concat(res&lt;I&gt;[1]);
&amp;nbsp; }
 }
 // creates an array of only your results or FeatureSets
 return results;
}
&lt;/I&gt;&lt;/I&gt;&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;With that, DeferredList is now a deprecated module and it is recommended that you look at the dojo/promise/all module. The API is much cleaner to work with and doesn't involve worrying about 2-dimensional arrays.&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://dojotoolkit.org/reference-guide/1.9/dojo/promise/all.html" rel="nofollow noopener noreferrer" target="_blank"&gt;http://dojotoolkit.org/reference-guide/1.9/dojo/promise/all.html&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Hope that helps.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 10:44:12 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-javascript-maps-sdk-questions/managing-a-deferred-list-of-query-tasks/m-p/220151#M20451</guid>
      <dc:creator>ReneRubalcava</dc:creator>
      <dc:date>2021-12-11T10:44:12Z</dc:date>
    </item>
    <item>
      <title>Re: Managing a deferred list of query tasks</title>
      <link>https://community.esri.com/t5/arcgis-javascript-maps-sdk-questions/managing-a-deferred-list-of-query-tasks/m-p/220152#M20452</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I get what you're saying about changing what is returned from the dojo.filter, but it didn't help.&amp;nbsp; Is there a recommendation on which is the better way to run my queryGeometryResultsHandler_toGrid?&amp;nbsp;&amp;nbsp; I tried dojo.map first:&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
function cleanQueryResults (queryResults) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; var successResults = [];
&amp;nbsp;&amp;nbsp;&amp;nbsp; queryResults = dojo.filter(queryResults, function (result) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return results[0];
&amp;nbsp;&amp;nbsp;&amp;nbsp; }); //filter out any failed tasks
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0;i&amp;lt;queryResults.length;i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; successResults = successResults.concat(queryResults&lt;I&gt;[1]);//these are all the successful querytasks, an array of featuresets
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
//then process each set of query results
dojo.map(successResults, function (results) {
 queryGeometryResultsHandler_toGrid(results);
 
});
}
&lt;/I&gt;&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Then I switched to dojo.forEach.&amp;nbsp; It seems like to like dojo.map is the better choice.&amp;nbsp; I can see that queryGeometryResultsHandler_toGrid executes one time, but it doesn't ever come back to this to process the other feature sets.&amp;nbsp; Should I be setting a variable for dojo.map and then returning something from that function?&amp;nbsp;&amp;nbsp; That function is still a work in progress.&amp;nbsp; It is supposed to be creating individual titlePanes within an existing div.&amp;nbsp;&amp;nbsp; I commented nearly everything I had out (it was copied from another project and needed tweaking anyway).&amp;nbsp; I expected this to execute for each one of my featureSets that are contained in successResults.&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
//output query results to grid sample function
function queryGeometryResultsHandler_toGrid(results){
&amp;nbsp;&amp;nbsp;&amp;nbsp; //puts the results of the query into a grid
&amp;nbsp;&amp;nbsp;&amp;nbsp; var tp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var myDiv = dojo.byId("attributeDiv");
&amp;nbsp;&amp;nbsp;&amp;nbsp; myDiv.innerHTML = "";
&amp;nbsp;&amp;nbsp;&amp;nbsp; var resultsLength = results.features.length;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var grid;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var allItems = dojo.map(results.features, function(feature){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return feature.attributes;
&amp;nbsp;&amp;nbsp;&amp;nbsp; });&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; resultsLength; i++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var items = allItems.slice(i, (i+1));&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items: items
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var currentStore = new dojo.data.ItemFileReadStore({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data: data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var currentLayout = [];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var addField;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tp = new dijit.TitlePane({ id: 'gridPane_'+paneId, title: paneId});&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myDiv.appendChild(tp.domNode);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&amp;nbsp; for (fieldName in items[0]) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (fieldName == "FID" || fieldName == "OBJECTID" ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addField = { field: fieldName, formatter: makeZoomButton };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentLayout.push(addField); 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (fieldName == "ROWGUID" || fieldName == "Shape" || fieldName == "CITY_NAME" || fieldName == "FID") {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; addField = { field: fieldName, hidden: true };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; currentLayout.push(addField);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addField = {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; field: fieldName,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: "120px"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentLayout.push(addField);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; */&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create Grid 
&amp;nbsp;&amp;nbsp; /*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; grid = new dojox.grid.DataGrid({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id: paneId+"_grid",
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; store: currentStore,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; structure: currentLayout
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, document.createElement('div'));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.byId(paneId+"_gridPane").appendChild(grid.domNode);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; grid.startup();
&amp;nbsp;&amp;nbsp; grid.canSort = function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tp.set("content",grid);
&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 10:44:16 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-javascript-maps-sdk-questions/managing-a-deferred-list-of-query-tasks/m-p/220152#M20452</guid>
      <dc:creator>TracySchloss</dc:creator>
      <dc:date>2021-12-11T10:44:16Z</dc:date>
    </item>
  </channel>
</rss>

