[GIS] ArcGIS Javascript API – Refresh

arcgis-javascript-api

The ArcGIS Javascript API has a nice refresh interface for ArcGISDynamicMapServiceLayer:

    var dynamicMapServiceLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer");
    map.addLayer(dynamicMapServiceLayer);
    dynamicMapServiceLayer.setDisableClientCaching(true);

    if (dynamicMapServiceLayer.disableClientCaching) {
        aspect.after(dynamicMapServiceLayer, "onUpdateEnd", function () {
            $.delay(15000, "UpdateDynamicLayer", function () {
                dynamicMapServiceLayer.refresh();
            });
        });
    }

But this is not generalized across the other layer types. Anyone have a solution for refreshing layers of any type?

Best Answer

Replace getImageUrl and modify the url before passing it to the callback:

    layer = new esri.layers.WMSLayer("http://sampleserver1c.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer", {
        visibleLayers: ['1', '2']
    });

    function extendLayer(layer)
    {
        var getImageUrl, tick;

        tick = 0;
        getImageUrl = layer.getImageUrl;

        layer.setDisableClientCaching = layer.setDisableClientCaching || function(disable)
        {
            if (disable)
            {
                layer.getImageUrl = function (extent, width, height, callback) {
                    var result = getImageUrl.call(layer, extent, width, height, function (url) {
                        callback.call(layer, url + "&_c=" + tick++);
                    });
                    return result;
                };
            }
            else
            {
                layer.getImageUrl = getImageUrl;
            }
        };
        return layer;
    }

    extendLayer ( layer ).setDisableClientCaching ( true );

    setInterval(function () {
        layer.refresh();
    }, 5000);

    map.addLayer(layer);