2016-12-13 11 views
0

私はHTTPリクエストを実行するコントローラを持っています。
この要求には、データを返すために2秒から4分の間の任意の時間がかかります。
検索に時間がかかりすぎてもリクエストをキャンセルするには、ユーザーがクリックする必要があるボタンを追加しました。角度サービスをキャンセルする約束

コントローラー:

$scope.search = function() { 
    myFactory.getResults() 
     .then(function(data) { 
     // some logic 
     }, function(error) { 
     // some logic 
    }); 
} 

サービス:

var myFactory = function($http, $q) { 
    return { 
     getResults: function(data) { 
      var deffered = $q.dafer(); 
      var content = $http.get('someURL', { 
       data: {}, 
       responseType: json 
      )} 

      deffered.resolve(content); 
      returned deffered.promise; 
     } 
    } 
} 

ボタンのクリック:私はimplemeするにはどうすればよい

$scope.cancelGetResults = function() { 

    // some code to cancel myFactory.getResults() promise 

} 

myFactory.getResults()約束をキャンセルするには、ボタンをクリックしてください。

+0

**手動キャンセルが必要ですか、タイムアウトのあるものが必要ですか? – Mistalis

+0

@Mistalis - 手動で、リクエストがタイムアウトするのを待つか、キャンセルをクリックすることができます。 –

+0

[AngularJSで$ httpリクエストをキャンセルする方法は?](http://stackoverflow.com/questions/13928057/how -to-cancel-an-http-request-in-angularjs) – Liam

答えて

0

使用可能な.resolve()メソッドを使用できます。

コントローラの約束を変数に渡します。

あなたの工場で引数として約束を取るメソッドをキャンセルします。その後、コントローラのcancelGetResults()関数でこのメソッドを呼び出します。

cancelメソッドでは、渡された約束で.resolveを呼び出すだけです。

これは実際に行う必要があります。

https://www.bennadel.com/blog/2731-canceling-a-promise-in-angularjs.htm

+0

あなたのリンクは死んでいます。 – Mistalis

+0

それは?それは私のためにうまくいく...同じ問題を抱えている人は誰ですか? –

1

質問は通常避けるべきdeferred antipatternを使用していますが、それはキャンセルケースに合う:

getResults: function(data) { 
    var deffered = $q.defer(); 

    $http.get('someURL', { 
     data: {}, 
     responseType: json 
    }).then(deffered.resolve, deferred.reject); 

    deffered.promise.cancel = function() { 
     deferred.reject('CANCELLED') 
    }; 

    returned deffered.promise; 
} 
+0

これに感謝しますが、私は$ scope.cancelGetResultsをどのように使ってこのことを理解できないのですか? –

+1

'$ scope.search'メソッドの' $ scope.resultsPromise = myFactory.getResults(...) 'のようなものです。 '$ scope.cancelGetResults'メソッドの' if($ scope.resultsPromise)$ scope.resultsPromise.cancel() 'です。 – estus

+0

上記を試してみましたが、うまくいきませんでした。エラーは "未定義のプロパティ 'cancel'を読み取ることができません" plunkerを提供してください。 –

1

のgetResultは、私たちがキャンセルを実装しているサービスです。

getResult = function(){ 
var deferred = $q.defer(); 
$http.get(url).success(function(result){ 
    deffered.resolve(result); 
}).error(function(){ 
deffered.reject('Error is occured!'); 
}); 
return deferred.promise; 
}; 

ここで、任意の安らかなAPI URLの代わりにurl変数が使用されています。あなたは与えられたコードでそれを使うことができます。

getResult().then(function (result) { console.log(result); }; 
関連する問題