[GIS] How to make query task synchronous in ArcGIS JSAPI

arcgis-10.1arcgis-javascript-apiquery-task

I am using ArcGIS JS API version 3.6. I want to make query task synchronize. While executing query task reaming code will wait until completion of query task.

For example I have shared my code here which contains query layer.

Case 1: In which I am directly executing the code and printing the log in console window, where you can see before the query task output is displaying

Case 2: In this case we have used alert (for time delay) in the code then value is getting before query task.

-Researching on Google and going through similar question

Case 1 screenshot :
-Screen shot for case 1

Case 2 screenshot :
-Screen shot for case 2

Any help will be great !!! thanks in advance : )

Best Answer

It is exactly as @Devdatta Tengshe already said so this is just to expand. Any code you want to execute only after the queryTask has returned simply goes in the function you've already defined. So, you can just move your console log statement to go in there after you've filled the array:

queryTask.execute(query, function(featureSet){
    for (var x = 0; x < featureSet.features.length; x++) {
       dataArray.push(featureSet.features[x].attributes.SYMBOLNAME);
    }
    console.log("dataArray=="+dataArray.length);
});

You can also define a second function (so the third parameter to queryTask that is called if queryTask returns an error instead of success:

queryTask.execute(query, function(featureSet){
    // stuff to do on success
}, function(error){
    // stuff to do on error
}

You don't have to declare the functions in the queryTask if you want to organise you code differently. You can declare them in the main body of your JavaScript and then just call them by name:

// code to prepare your query task here
...

// execute your query passing it the callback functions
queryTask.execute(query, querySuccess, queryError);

function querySuccess(featureSet) {
    // stuff to do on success
}

function queryError(error) {
    // stuff to do on error
}