5

グローバル メソッドを設定して HTTP リクエストを中止する方法は明らかです。の線に沿った何か

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

$scope.abortRequests = function() {
    $scope.canceller.resolve();
}

ただし、特定のリクエストのみを中止できるようにしたいです。中止できるようにするために必要なリクエスト用に別のリソースを定義できますが、それはかなり醜いです。タイムアウトを条件付きにすることができる $resource を呼び出すときに、パラメーターまたは何かを渡す方法はありますか? たぶん、次のようになります。

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

しかし、どうすれば FOO にアクセスできますか?

洞察をありがとう!

4

1 に答える 1

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;
    };
});
于 2015-09-08T20:25:13.977 に答える