In one of my sites, I add a bunch of different services that are either tiled or dynamic services. I have an array of urls that I put into a promise and test. If the url returns a valid response, I add it either as a dynamic or tiled layer
var promises = [];
var layersToAdd = [];
array.forEach(urlList, function (layer) {
promises.push(testService(layer));
});
var allPromises = new all(promises); //uses "dojo/promise/all"
allPromises.then(function (response) {
response.forEach(function (r) {
if (r.resolution) {
var newLayer;
if (r.layer.type === "dynamic") {
newLayer = new ArcGISDynamicMapServiceLayer(r.layer.url, {
id: r.layer.id
});
} else {
newLayer = new ArcGISTiledMapServiceLayer(r.layer.url, {
id: r.layer.id
});
}
layersToAdd.push(newLayer);
}
});
map.addLayers(layersToAdd);
});
function testService(layer) {
var deferred = new Deferred();
var request = new XMLHttpRequest();
try {
request.open("get", layer.url + "?f=json");
}
catch (error) {
console.error(error);
deferred.resolve({ layer: layer, resolution: false });
return deferred.promise;
}
request.onloadend = function () {
if (this.status !== 200) {
console.log("Could not load " + layer.name);
deferred.resolve({ layer: layer, resolution: false });
} else {
var response = JSON.parse(this.response);
if (response.error) {
console.log("Could not load " + layer.name);
deferred.resolve({ layer: layer, resolution: false });
} else {
deferred.resolve({ layer: layer, resolution: true });
}
}
};
request.send();
return deferred.promise;
}