[解決済み] 誰かangularjsの$qサービスの使用について説明してください。[重複しています]。
質問
私は、初めて
angularjs
.見た
$q
を、プロミスを確認するための restful api 呼び出しで使用します。
$q.defer()
は、プロミス・オブジェクトを保持するために使用されました。
プロミスについて読みましたが、何も分かりませんでした。
を使わずにapiコールをすることはできるのですが
$q
しかし、これは記事のどこかで使われています。
の正確な使い方を知りたいのです。
$q
を使わずにAPIを呼び出した場合の違い
$q
.
親切に教えてください。 感謝
解決方法を教えてください。
qについて書いた記事が役に立つと思います。
$qの紹介
qはangularで定義されたサービスです。new Promise()と同じです。しかし、$qは開発者が複雑なタスクをより簡単に実行するために使用できる追加機能を強化することで、物事を次のレベルへと導きます。
これは$qを使ったプロミス作成のサンプルです。
angular.module("app",[])
.controller("ctrl",function($scope,$q){
var work = "resolve";
var promise = $q(function(resolve, reject) {
if (work === "resolve") {
resolve('response 1!');
} else {
reject('Oops... something went wrong');
}
});
promise.then(function(data) {
alert(data)
})
})
$q.defer()
$q.defer() は、プロミスコンストラクタのインスタンスを返します。defer オブジェクトを作成すると、そのオブジェクトからアクセスできるメソッドとプロパティが以下のようになります。
resolve(value)
- は派生したプロミスをその値で解決します。値が$q.rejectによって構築された拒否である場合、代わりにプロミスが拒否されます。
reject(reason)
- は、その理由とともに派生したプロミスを拒否します。これは$q.rejectによって構築された拒絶で解決することと同じです。
notify(value)
- は、プロミスの実行状況についての更新情報を提供します。これは、プロミスが解決または拒否される前に、複数回呼び出されるかもしれません。
promise
- Promise} - この遅延に関連付けられたプロミスオブジェクト
例を見る
angular.module("app",[])
.controller("ctrl",function($scope,$q){
var work = "resolve";
function getData(){
var obj = $q.defer();
if (work === "resolve") {
obj.resolve('response 1!');
} else {
obj.reject('Oops... something went wrong');
}
return obj.promise;
}
getData().then(function(data) {
alert(data)
})
})
$q.all()
複数のリクエストを一度に送信する必要がある場合、$q.all() サービスを使用することができます。
$q.all([$http.get('data1.json'),$http.get('data2.json')])
.then(function(response){
console.log(response[0].data) // data1.json response
console.log(response[1].data) // data1.json response
})
ここでは、2つのJSONファイルに対して2つのhttpリクエストが同時に送信され、データが取得されています。レスポンスは配列として返され、レスポンスの順序はHTTPリクエストの順序と同じです。
$q.race()
$q.race() は $q.all() と非常によく似ています。しかし、各リクエストのレスポンスを送信する代わりに、ひとつのリクエストのレスポンスだけを返します。具体的には、最初に実行されたリクエストのレスポンスのみを返します。これは、他のリクエストを送信しないことを意味するものではありません。すべてのリクエストは送信されますが、最初に実行されたリクエストのレスポンスだけが返されます。
$q.race([$http.get('data1.json'),$http.get('data2.json')])
.then(function(response){
console.log(response[0].data) // return one response
})
ここで、responseはdata1.Jsonまたはdata2.jsonのいずれかになります。これがこのメソッドを使うことの欠点です。最初に実行されたリクエストのレスポンスを返すので、どのリクエストのレスポンスがプロミスによって解決されるかを確認することができないのです。このメソッドは、すべてのリクエストのレスポンスを見たくないバルクリクエストに便利です。
結論
プロミスでないオブジェクト/コールバックからプロミスを構築するために$qを使用し、既存のプロミスで動作するように$q.all()と$q.race()を使用します。
関連
-
処理されない例外が発生しました。Angular 実行中のプロジェクトで NGCC に失敗しました。
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] angular.serviceとangular.factoryの比較
-
[解決済み] AngularJSのng-repeatでキーと値を反復処理する方法は?
-
[解決済み] あるAngularJSのコントローラが別のコントローラを呼び出すことはできますか?
-
[解決済み] AngularJS 。非同期データでサービスを初期化する
-
[解決済み] AngularJSのサービスをコンソールからテストするにはどうしたらいいですか?
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
-
[解決済み】AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] select 要素のデフォルト値を設定するための ng-option の使用方法
-
[解決済み] AngularJSのグローバル変数
-
[解決済み] ReferenceError: Angularは定義されていません。
-
[解決済み] ag-gridの行の追加/削除
-
[解決済み] AngularJSでkeypressイベントを使用するには?
-
[解決済み] Angularjsを使用してローカルストレージにデータを保存するにはどうすればよいですか?
-
[解決済み] Angular JSによるシンプルなポップアップ
-
[解決済み] 入力フィールドにフォーカスを当てるには?
-
[解決済み] AngularJSでEnterキーを押したときにフォームを送信する
-
[解決済み] 3つの関数を順番に実行するには、どのように呼び出せばよいですか?