1. ホーム
  2. angularjs

[解決済み] 誰かangularjsの$qサービスの使用について説明してください。[重複しています]。

2022-02-17 11:50:52

質問

私は、初めて 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()を使用します。