【问题标题】:javascript/angular $promise and catch as an independent functionjavascript/angular $promise 和 catch 作为一个独立的函数
【发布时间】:2017-06-01 07:49:39
【问题描述】:

所以我有多个函数,它们都使用大致相同的 $promise.then -> catch 链接。我想知道如何将其作为一个单独的函数来减少重复代码。

使用“几乎”相同链接的两个函数的示例:

动态地图服务

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';
  });
};

所以问题是是否有可能创建一个单独的函数来完成从 $promise.then -> 捕获的所有工作?这样我就不必有很多重复项。

【问题讨论】:

  • 你需要一个带参数的函数,并在函数体中使用参数

标签: javascript angularjs typescript promise angular-promise


【解决方案1】:

我希望我做对了

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');
}

您可以使用以上方法调用

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');

抱歉发布 ES2015+ 代码

【讨论】:

    【解决方案2】:

    你可以概括如下

    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))
    };
    

    【讨论】:

    • 你选择了 catch 来制作通用...但是两个 catch 块是不同的
    • 您还确保 .catch 不会捕获任何东西 - catch 的参数应该是一个函数
    猜你喜欢
    • 2016-09-30
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2018-02-17
    • 2021-11-05
    相关资源
    最近更新 更多