javascript - Angular 将相同的成功和错误函数体应用于不同的 $http 请求

标签 javascript angularjs algorithm ecmascript-6

我不确定要搜索什么确切的关键字。所以我决定在这里寻求帮助。

我认为这更像是一个JavaScript 相关问题,而不是 Angular 问题。不管怎样,这是我的问题。

我处于 DRY 状态(不要重复自己)。我正在尝试将我的两个 $http.put$http.delete 方法的成功和错误函数合并为一个,因为它们共享相同的功能。

这是我当前的代码

// Delete permanenty button action
  $scope.delete_donor = function(form) {
    $http.delete(url)
      .success(function() {
        // @TODO DRY? DELETE UPDATE delete_donor update_donor
        response.ipv4 = INT_TO_STR_IP(response.ipv4)
        // Show deleted data to user after operation
        $scope.donor.saved_data = response.saved_data
        $location.path("/")
      })
      .error(function(response) {
        $scope.donor.validation_errors = SERVER_VALIDATION_ERROR(response)
      })
  }
  // Save changes button action
  $scope.update_donor = function(form) {
    var body = $scope.donor.data
    delete body.ipv4
    $http.put(url, body)
      .success(function(response) {
        // @TODO DRY? DELETE UPDATE delete_donor update_donor
        response.ipv4 = INT_TO_STR_IP(response.ipv4)
        // Show new updated data to user after operation
        $scope.donor.saved_data = response.saved_data
        $location.path("/")
      })
      .error(function(response) {
        $scope.donor.validation_errors = SERVER_VALIDATION_ERROR(response)
      })

如您所见,$http.delete().success().error() 和 $http.put().success().error() 方法是相同的。

我正在尝试做类似的事情

WHATSTHIS unify(response) {
  WOOT .success(function(response) { // SAME CODE BODY })
  WOOT .error(function(response) { // SAME CODE BODY })
}

// Delete permanenty button action
  $scope.delete_donor = function(form) {
    $http.delete(url)
      .unify(response)
  }
  // Save changes button action
  $scope.update_donor = function(form) {
    var body = $scope.donor.data
    delete body.ipv4
    $http.put(url, body)
      .unify(response)

我只知道一种实现类似目标的方法:

var unifySuccess = function(response) {
  // DO
}
var unifySuccess = function(response) {
  // DO
}

// Delete permanenty button action
  $scope.delete_donor = function(form) {
    $http.delete(url)
      .sucesss(unifySuccess)
      .error(unifyError)

但也许还有其他聪明的方法可以做到这一点?

感谢您的帮助。

最佳答案

您可以做的是创建您自己的 http 请求服务,该服务将执行这些功能并将 promise 作为响应返回

像这样

angular.module('myApp')
  .service('proxyHttp', function($http) {
    return function(options) {
      return $http(options)
        .then(
          function() {
            // success callback
          },
          function() {
            // error callback
          });
    }
  })

更新:例如

angular.module('myApp', [])
  .service('proxyHttp', function($http, $q) {
    return function(options) {
      console.log('Run proxy http');

      return $http(options)
        .then(
          function(response, status) {
            console.log('always do this on success');
            // success callback

            return response;
            // here we return the response or what ever you want,
            // and we can continue handling it
          })
        .catch(function() {
          console.log('we failed!');
          // error callback

          return $q.reject();
        })
    }
  })
  .controller('testController', function($scope, proxyHttp) {
    $scope.testError = function() {
      console.log('Run test error method');

      proxyHttp({
          url: 'http://www.google.com',
          method: 'GET'
        })
        .then(
          function() {})
        .catch(function() {
          console.log('we continue handling our error here...');
        });
    }


    $scope.testSuccess = function() {
      console.log('Run test success method');

      proxyHttp({
          url: 'http://httpbin.org/ip',
          method: 'GET'
        })
        .then(
          function(response) {
            console.log('continue chaining after success for the original promise');
            console.log('Response data: '
              response.data.origin);
            console.log('read more about pomise and chaining here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise');
          })
        .catch(function() {
          console.log('error');
        });
    }
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>


<div ng-app="myApp">
  <div ng-controller="testController">
    <button ng-click="testError()">Click Me for error!</button>
    <br/>
    <br/>
    <button ng-click="testSuccess()">Click Me for success!</button>
  </div>
</div>

关于javascript - Angular 将相同的成功和错误函数体应用于不同的 $http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39045063/

相关文章:

javascript - JS - 样式更改问题

javascript - 我如何使用 jQuery 的 .find 方法并以正则表达式作为参数?

angularjs - Ng-Select 在 Ng-Select 中从第一个选择框中选择下一个值

angularjs - AngularJS [$ injector :unpr] Unknown provider

java - LZW - 压缩率

javascript - 如何为 Angular JS 条形图添加事件

javascript - Req.Body 返回 "undefined"值

javascript - AngularJS Controller 内的嵌套应用程序

python-3.x - 在 Python 中的置换树上实现深度优先搜索

algorithm - 为什么 O(n^2) 算法在相同输入上比 O(n) 算法运行得更快?