【问题标题】:how to cancel a promise with $resource in angularjs in 1.5如何在 1.5 中取消使用 angularjs 中的 $resource 的承诺
【发布时间】:2016-08-10 19:17:17
【问题描述】:

我正在使用 Angular 1.5.7,如果需要时间,我想取消对资源的删除。我正在使用 MEAN 堆栈,有时我看到我的资源上的删除被视为待处理(是 mongo 很慢吗?)。 下面是我调用删除的控制器中的工厂和 sn-p: * 工厂:

      .factory('addressesFactory', ['$resource', 'baseURL', function ($resource, baseURL) {
    return $resource(baseURL + 'addresses/:id', {id: '@_id'}, {
      'update': {
        method: 'PUT'
      },
      'delete': {
        method: 'DELETE'
      }
    });
  }])
  • 来自控制器的 sn-p:

    $scope.delete = function (address, addressesList) {
    
    $scope.deleteDisabled=true;
    
    console.log('[ModeratorsCtrl] Deleting:' + address.name);
    console.log('[ModeratorsCtrl] ' + addressesList.length);
    addressesFactory.delete({id: address._id}).$promise.then(
      function (response) {
        $scope.deleteDisabled=false;
        console.log('[ModeratorsCtrl] Address deleted successfully');
      },
      function (response) {
        $scope.deleteDisabled=false;
        var message = '[ModeratorsCtrl] Error: ' + response.status + ' ' + response.statusText;
        console.log(message);
      }
    );
    

    };

我看到了这篇文章How to cancel $resource requests 并阅读了这篇关于取消请求的文章:https://docs.angularjs.org/api/ngResource/service/$resource#!与 $cancelRequest() 但我有点困惑。 谁能给我关于如何在我的实施中取消承诺的最佳实践? 问候,

【问题讨论】:

标签: javascript angularjs


【解决方案1】:

假设您的资源是Users,要取消请求,您应该命名您的操作,例如

var request = Users.query();

此时```request 是一个promise。你可以简单地做一个,

request.$cancelRequest();

取消。

【讨论】:

  • 好的谢谢我会试一试我想我必须在我的控制器中删除调用后执行这样的调用:addressesFactory.$cancelRequest();假设我在我的工厂设置cancellable: true
  • 确保通过options 在资源上设置cancellable: true,否则$cancelRequest() 方法将不会被公开。
【解决方案2】:

感谢您的帮助 我最终在我的工厂做了以下事情:

  .factory('addressesFactory', ['$resource', 'baseURL', function ($resource, baseURL) {
    return $resource(baseURL + 'addresses/:id', {id: '@_id'}, {
      'update': {
        method: 'PUT'
      },
      'delete': {
        method: 'DELETE',
        cancellable: true
      }
    });
  }])

然后在我的控制器中:

 $scope.delete = function (address, addressesList) {
    $scope.deleteDisabled = true;//prevent multiple click

    var deleteRequest = addressesFactory.delete({id: address._id});
    deleteRequest.$promise.then(
      function (response) {
        $scope.deleteDisabled = false;
        console.log('[ModeratorsCtrl] Address deleted successfully');
      },
      function (response) {
        $scope.deleteDisabled = false;
        var message = '[ModeratorsCtrl] Error: ' + response.status + ' ' + response.statusText;
        console.log(message);
      }
    );

    $timeout(function () {//2 seconds then cancel the promise
      if ($scope.deleteDisabled === true) {
        console.log('[ModeratorsCtrl] Cancel ...');
        deleteRequest.$cancelRequest();
        $scope.deleteDisabled = false;
      }
    }, 2000);
  };

希望这能坚持最佳做法,请随时提供您的反馈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 2015-01-10
    • 2016-07-26
    • 1970-01-01
    • 2015-10-19
    • 2017-09-21
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多