Change layer definitions properly repeatedly

854
5
11-21-2016 10:13 PM
PitersonPaulgek
New Contributor III

Hi,

We do time series "manually" for some reasons.

We created recursive function.

The issue is with changing of layer definitions repeatedly. The layer disappears between first and second (recursive) call to the function.

var isPlay = true;
var layerDefinitionsTS = [];

var currentTimeSeriesLayer = (initialized outside);
function PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds) {
   if (startYear == endYear)
      return;
   if (isPlay == false)
      return;
//layerDefinitionsTS = [];
      currentTimeSeriesLayer.setLayerDefinitions(null, true);

      layerDefinitionsTS[currentTimeSeriesLayer.visibleLayers[0]] = "Year = " + startYear;
      currentTimeSeriesLayer.setLayerDefinitions(layerDefinitionsTS, false);

      setTimeout(function (startYear, endYear, timeIntervalMilliSeconds) {
      startYear = startYear;
      console.log("Year: " + startYear);

      startYear = startYear + 1;

      PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds);
   }, timeIntervalMilliSeconds, startYear, endYear, timeIntervalMilliSeconds);
};

Any help will be appreciated.

0 Kudos
5 Replies
FC_Basson
MVP Regular Contributor

Setting timeouts within the function scope might not be the best option.  You should also create handlers for each timeout  which you can clear before updating the layer definitions e.g. 

...

var toHandler = setTimeout( function(...){
   ...
   clearTimeout(toHandler);
})‍‍‍‍

Why not consider time-enabling your layer and displaying it with a Time Slider (TimeSlider | API Reference | ArcGIS API for JavaScript 3.18)?

0 Kudos
PitersonPaulgek
New Contributor III

Thank you for response FC Basson,

In your code, where is setLayerDefinition()?

We cannot use ESRI widget because the custom requirements for time slider UI.

0 Kudos
FC_Basson
MVP Regular Contributor

Same line as yours. Seeing that you are calling the PlayTimeSeries function recursively, you can call the clearTimeout method just before the setTimeout method.

0 Kudos
PitersonPaulgek
New Contributor III

FCBasson,
Should we use a global variable "toHandler" to clearTimeout(toHandler)?

Like this? -

var isPlay = true;
var layerDefinitionsTS = [];
var currentTimeSeriesLayer = (initialized outside);
var toHandler;

function PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds) {
   if (startYear == endYear)
      return;
   if (isPlay == false)
      return;
//layerDefinitionsTS = [];
      currentTimeSeriesLayer.setLayerDefinitions(null, true);
      layerDefinitionsTS[currentTimeSeriesLayer.visibleLayers[0]] = "Year = " + startYear;
      currentTimeSeriesLayer.setLayerDefinitions(layerDefinitionsTS, false);
      clearTimeout(toHandler);
      toHandler = setTimeout(function (startYear, endYear, timeIntervalMilliSeconds) {
      startYear = startYear;
      console.log("Year: " + startYear);
      startYear = startYear + 1;
      PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds);
   }, timeIntervalMilliSeconds, startYear, endYear, timeIntervalMilliSeconds);
};

0 Kudos
PitersonPaulgek
New Contributor III

I tried - the layer is not visible.

I can see the layer in the map.layerIDs.

I can get the count by queryTask.executeForCount() after applying layer definitions - each time different.

What is the reason the layer is not visible? How to check it?

0 Kudos