Amir
Amir

Reputation: 37

javascript/angular $promise and catch as an independent function

So i have multiple functions that all use approximately the same $promise.then -> catch chaining. I was wondering how i could make this as a separate function to reduce duplicate code.

Example of two functions that use "almost" the same chaining:

neDynamicMapService

function checkGeoDataServiceDynamicMap() {
  neDynamicMapService.get({
    'bbox': '282254.0907785857,7067749.991627717,283178.8115196741,7068194.492510452',
    'size': '699,336',
    'dpi': '96',
    'format': 'png24',
    'transparent': 'true',
    'bboxSR': 25833,
    'imageSR': 25833,
    'layers': 'show:1,2,3',
    'layerDefs': '{"3":"seksjonsnr=0}"',
    'token': $scope.geoToken,
    'f': 'image'
  }).$promise.then(
    function callback(data) {
      $scope.geoDataServiceDynamicMap = ((data.data !== null) && (data.headers[Object.keys(data.headers)[0]] === "image/png")) ? 'geoDataServiceDynamicMap_OK' : 'monitoring_fail';
      $scope.allChecks.push($scope.geoDataServiceDynamicMap);
    }
  ).catch(function errback(err) {
    $scope.geoDataServiceDynamicMap = 'monitoring_failure';
  });
};

checkGeoDataServiceIdentity

function checkGeoDataServiceIdentity() {
  neIdentityMapService.get({
    'sr': '25833',
    'ImageDisplay': '699,336,96',
    'mapExtent': '121517.75468785927,6612387.032135592,121619.89991039888,6612464.586427085',
    'geometry': 'esriGeometryPoint',
    'geometryType': 'true',
    'layers': 'all',
    'tolerance': '0',
    'token': $scope.geoToken,
    'f': 'json'
  }).$promise.then(
    function callback(data) {
      $scope.geoDataServiceIdentity = ((data.data !== null) && (data.headers[Object.keys(data.headers)[0]] === "image/png")) ? 'geoDataServiceIdentity_OK' : 'monitoring_fail';
      $scope.allChecks.push($scope.geoDataServiceIdentity);
    }
  ).catch(function errback(err) {
    $scope.geoDataServiceIdentity = 'monitoring_failure';
  });
};

So the question is if it is possible to make a seperate function that basically does the job of everything from $promise.then -> catch? That way i don't have to have lots of duplicates.

Upvotes: 0

Views: 44

Answers (2)

Jaromanda X
Jaromanda X

Reputation: 1

I hope I got this right

function generic(service, getOptions, thing) {
    service.get(getOptions).$promise.then(data => {
        $scope[thing] = ((data.data !== null) && (data.headers[Object.keys(data.headers)[0]] === "image/png")) ? thing+"_OK" : 'monitoring_fail';
        $scope.allChecks.push(thing);
    }).catch(err => $scope[thing] = 'monitoring_fail');
}

You can call the above using

generic(neDynamicMapService, {
    'bbox': '282254.0907785857,7067749.991627717,283178.8115196741,7068194.492510452',
    'size': '699,336',
    'dpi': '96',
    'format': 'png24',
    'transparent': 'true',
    'bboxSR': 25833,
    'imageSR': 25833,
    'layers': 'show:1,2,3',
    'layerDefs': '{"3":"seksjonsnr=0}"',
    'token': $scope.geoToken,
    'f': 'image'
  }, 'geoDataServiceDynamicMap');

generic(neIdentityMapService, {
    'sr': '25833',
    'ImageDisplay': '699,336,96',
    'mapExtent': '121517.75468785927,6612387.032135592,121619.89991039888,6612464.586427085',
    'geometry': 'esriGeometryPoint',
    'geometryType': 'true',
    'layers': 'all',
    'tolerance': '0',
    'token': $scope.geoToken,
    'f': 'json'
  }, 'geoDataServiceIdentity');

Apologies for posting ES2015+ code

Upvotes: 1

Aravind
Aravind

Reputation: 41581

You can generalize as below

var catchFunction = function errback(err) {
    $scope.geoDataServiceDynamicMap = 'monitoring_failure';
  });


function checkGeoDataServiceDynamicMap() {
  neDynamicMapService.get({
    'bbox': '282254.0907785857,7067749.991627717,283178.8115196741,7068194.492510452',
    'size': '699,336',
    'dpi': '96',
    'format': 'png24',
    'transparent': 'true',
    'bboxSR': 25833,
    'imageSR': 25833,
    'layers': 'show:1,2,3',
    'layerDefs': '{"3":"seksjonsnr=0}"',
    'token': $scope.geoToken,
    'f': 'image'
  }).$promise.then(
    function callback(data) {
      $scope.geoDataServiceDynamicMap = ((data.data !== null) && (data.headers[Object.keys(data.headers)[0]] === "image/png")) ? 'geoDataServiceDynamicMap_OK' : 'monitoring_fail';
      $scope.allChecks.push($scope.geoDataServiceDynamicMap);
    }
  ).catch(catchFunction(err))
};

function checkGeoDataServiceIdentity() {
  neIdentityMapService.get({
    'sr': '25833',
    'ImageDisplay': '699,336,96',
    'mapExtent': '121517.75468785927,6612387.032135592,121619.89991039888,6612464.586427085',
    'geometry': 'esriGeometryPoint',
    'geometryType': 'true',
    'layers': 'all',
    'tolerance': '0',
    'token': $scope.geoToken,
    'f': 'json'
  }).$promise.then(
    function callback(data) {
      $scope.geoDataServiceIdentity = ((data.data !== null) && (data.headers[Object.keys(data.headers)[0]] === "image/png")) ? 'geoDataServiceIdentity_OK' : 'monitoring_fail';
      $scope.allChecks.push($scope.geoDataServiceIdentity);
    }
  ).catch(catchFunction(err))
};

Upvotes: 0

Related Questions