2017-04-19 11 views
-1

私はangularjsに新しくなりました。約束を確認するために安らかなAPI呼び出しで$qを見ました。 $q.defer()は、約束オブジェクトを保持するために使用されました。 私は約束を読んだが、何も手に入らなかった。私は$qせずにAPI呼び出しを行うことができますが、記事のどこかで使用されていますが、 です。

私は$qの正確な使い方と、$qのないapi呼び出しの違いについて知りたいと思います。

助けてください。 ありがとう

答えて

10

私は$ qについて書いた記事はあなたを助けるかもしれないと思います。

はじめは$ qに

$ qはサービスを定義する角度です。新しい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は()約束コンストラクタのインスタンスを返します。遅延オブジェクトを作成すると、そのオブジェクトからアクセスできる次のメソッドとプロパティがあります。

resolve(value) - 派生した約束を値で解決します。値が$ q.reject経由で構築された拒否の場合、代わりに約束が拒否されます。

reject(reason) - 派生した約束を理由で拒否します。これは、$ q.reject経由で生成された拒否でそれを解決することと同じです。

notify(value) - 約束の実行状況に関する最新情報を提供します。これは、約束が解決または拒絶される前に複数回呼び出されることがあります。

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と非常によく似ています。しかし、各要求の応答を送信する代わりに、1つの要求応答のみを返します。具体的には、実行された最初の要求の応答のみを返します。それが他のリクエストを送信しないことを意味するわけではありません。すべての要求は送信されていますが、実行された最初の要求の応答のみが返されます。

$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()は既存の約束を処理するために使用します。

+1

あなたのコードの代わりに、スクリーンショットを投稿してください。 – Mistalis

+1

@Mistalisさんが画像を削除しました –

+0

@sachilaranawakaさんに書いてくれてありがとうございました...あなたはangularjsで '$ q'をどこで使うべきですか?実際に '$ q'で約束をどのように使うことができますか? –

3

私はこの質問が好きです。私もこのことに直面していたからです。

これは、関数を非同期で実行し、処理が完了したときにその戻り値を使用するのに役立つサービスです。

Brief Description

Refer example

Promise with $q

例:

app.service("githubService", function($http, $q) { 

    var deferred = $q.defer(); 

    this.getAccount = function() { 
     return $http.get('https://api.github.com/users/haroldrv') 
      .then(function(response) { 
       // promise is fulfilled 
       deferred.resolve(response.data); 
       // promise is returned 
       return deferred.promise; 
      }, function(response) { 
       // the following line rejects the promise 
       deferred.reject(response); 
       // promise is returned 
       return deferred.promise; 
      }); 
    }; 
}); 
+0

@Veeraを書いてくれてありがとう...私は '$ q'サービスを使わずに知りたいのは、私たちがapiに同期呼び出しを行っているということです。 –

+0

同期呼び出しと非同期呼び出しについては、これを参照してください。http://stackoverflow.com/questions/5187968/how-should-i-call-3-functions-in-order-to-execute-them-one-after-the-other –

関連する問題