如何在angularjs中设置条件$资源超时?

Gre*_*lec 5 angularjs angular-resource angular-http

似乎很清楚如何设置一个全局方法来中止http请求.有点像

$scope.canceller = $q.defer();
var API = $resource('http:/foo.com', {}, {get: { 
    method:'GET',
    timeout:$scope.canceller.promise
}});

$scope.abortRequests = function() {
    $scope.canceller.resolve();
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够仅中止特定请求.我可以为我需要能够中止的请求定义单独的资源,但这非常难看.当我调用可以允许超时有条件的$ resource时,有什么方法可以传入参数或其他东西吗?也许是这样的:

var API = $resource('http:/foo.com', {}, {get: { 
    method:'GET',
    timeout:function() { if (FOO) { return $scope.canceller.promise; }}
}});
Run Code Online (Sandbox Code Playgroud)

但是如何访问FOO?

感谢您的任何见解!

小智 0

也许您可以尝试将 $resource 包装为模型并通过这样的服务调用访问数据。该示例显示,只有 $routeChangeStart 解决了超时承诺。所以正如你提到的,它在某种程度上是有条件的。

app.factory('fooModel', function ($resource) {
    return function (canceler) {
        return $resource('http:/foo.com', {},
            {
                query:  {method:'GET', timeout: canceler.promise },
            }
        );
    };
});

app.service('fooService', function (fooModel, $q, $rootScope) {
    this.getBar = function(whatEver) {
        var deferred = $q.defer();
        var params = {};
        var canceler = $q.defer();

        $rootScope.$on('$routeChangeStart', function () {
            canceler.resolve();
        });

        fooModel(canceler).query(
            params,
            function(response) {
                deferred.reject(response);
            }, function(error) {
                deferred.reject(error);
            });
        return deferred.promise;
    };
});
Run Code Online (Sandbox Code Playgroud)