2017-03-20 12 views
3

を返しサービスからのHTTP要求の取り消し:私は、次の方法で私のコントローラでは、このメソッドを使用AngularJS - 私はのように見えるサービスメソッド持って約束

this.myServiceFunction = function(){ 
    var deferred = $q.defer(); 
    $http({ 
     method: 'GET', 
     url: 'domain/myendpoint' 
    }) 
     .success(function(data){ 
      deferred.resolve(data); 
     }) 
     .error(function(data){ 
      deferred.reject(data); 
     }); 
    return deferred.promise; 
}; 

$scope.myControllerFunction = function(){ 
    myService.myServiceFunction().then(function(){ 
     // Do things when promise resolves 
    }); 
}; 

上記のHTTP呼び出しをコマンド上の別の関数でキャンセルしたいと思います。私はこのanswerを見つけたので、$q.defer()から返されたオブジェクトのresolve()メソッドを呼び出してHTTPリクエストを取り消すことができます。しかし、私のコードベースでは、このオブジェクトは決して私のコントローラで利用可能になりません。

myService.myServiceFunction()は、上記の例では、$q.defer()から返されたpromiseオブジェクトを返します。私の持つ範囲内でHTTPリクエストをキャンセルするにはどうすればいいですか?

+0

[前の質問](http://stackoverflow.com/questions/13928057を参照してください。/how-to-cancel-an-http-request-in-angularjs)を参照してください。 –

+0

@マークス。あなたはその質問を読んだのですか? –

+0

** RxJs **を使ってみませんか? – Hosar

答えて

2

以下は、元のコードのオーバーヘッドなしで、質問に答えます。

this.myServiceFunction = function(){ 
    this.canceler = $q.defer(); 
    return $http({ 
    method: 'GET', 
    url: 'domain/myendpoint', 
    timeout: this.canceler.promise 
    }); 
}; 

this.cancelServiceFunction = function() { 
    return this.canceler.resolve(); 
}; 

しかし、あなたが何らかの理由でそのパターンを使用する必要がある場合は、以下を使用することができます。

this.myServiceFunction = function(){ 
    this.canceler = $q.defer(); 
    this.deferred = $q.defer(); 

    $http({ 
    method: 'GET', 
    url: 'domain/myendpoint', 
    timeout: this.canceler.promise 
    }) 
    .success(function(data){ 
    deferred.resolve(data); 
    }) 
    .error(function(data){ 
    deferred.reject(data); 
    }); 

    return deferred.promise; 
}; 

this.cancelServiceFunction = function() { 
    return this.canceler.resolve(); 
}; 
+0

これは同じです私が参照したリンクで提供された回答。これは私がしたくない 'myServiceFunction()'から戻りオブジェクトを変更する必要があります。これは私のコードベースで流行しているパターンであり、コントローラを変更すると多くの下流側の変更が必要になるでしょう。 –

+0

@LloydBanks 'myServiceFunction()からの戻りオブジェクトはまったく変更されません。あなたが望むなら、古い 'success'と' error'コールバックを使用してください)。彼は冗長な 'var deferred = $ q.defer();'を取り除き、キャンセラートークンを加えます。 1つの文字を変更することなく、コントローラで通常どおりに行うことができます。 –

+0

私はあなたのコードを整理しようとしていました。私はあなたの望むものを与えるために私の答えを更新します。 –

関連する問題