2016-06-28 3 views
11

の角度で$ qを使用して好きです:

var deferred = $q.defer(); 
$http.get(config.apiHost + details.url) 
    .success(function (data) { 
     deferred.resolve(data); 
    }).error(function (msg) { 
     deferred.reject(msg); 
    }); 
return deferred.promise; 

が、我々はまた、$を使用しないでも、このアプローチを使用することができますQ:

return $http.get(config.apiHost + details.url) 
    .success(function (data) { 
     return data; 
    }).error(function (msg) { 
     return msg; 
    }); 

と$ HTTP自体は約束を返すように、私はまた、より単純化されたアプローチを使用することができます。

$http.get(config.apiHost + 'posts') 
     .success(function (data) { 
      console.log(data) 
     }).error(function (msg) { 
      console.log(msg); 
     }); 

では、$ qと$ httpの間のこれらの間の違いは何でしょうか?両方とも約束を返し、どちらも非同期ですか? angularは$ qにいくつかの追加機能を提供しますか? 良い答えが見つかりません。

+0

あなたは$ qを持つ他の非同期操作との約束を返すことができます。 $ httpはAJAX呼び出しから約束を返します。 – Hoyen

+0

のような他の操作?ファイルを読み込むなど –

+0

デフォルトで約束をサポートしていません$タイムアウト – Hoyen

答えて

2

$qは、デフォルトで約束をサポートしていないライブラリや、Promiseのネイティブ実装(たとえば、IE9などの古いブラウザの場合)に依存できないライブラリとの互換性のためにのみ使用されます。そうでなければそれを使う理由はありません。あなたが約束ベースの$timeoutを作りたければ、その例があります。これらの正確な理由により、$http自体がフードの下で$qを使用します。 (削除されたので)

は、他のどのとは違っの答えは、あなたが順番に$qを使用する必要はありませを行い、提案してきた「店舗」$http約束の結果に。私は約束を保管することを推奨しません(これはスパゲッティコードにつながる傾向があります)。しかし、絶対にこれを行う必要がある場合は、$httpから得られる約束を保存することができます。一度だけ実行することを約束します。

約束が解決/拒否された後にthenに渡された関数は、最初に約束を作成した元のアクションを再呼び出しせずに、次の目盛りで解決されます - IOW、約束の結果がそのオブジェクト。あなたのタイトルが間違っている:

はまた、ABITこの回答の範囲外であるが、それは基本的に次のコードの断片は、

function legacyGet() { 
    const deferred = $q.defer() 
    $http.get('http://www.google.com') 
    .then((response) => deferred.resolve(Object.assign(response, {foo: bar})) 
    .catch((error) => deferred.reject(error)) 
    return deferred.defer 
} 

function modernGet() { 
    return $http.get('http://www.google.com') 
    .then((response) => Object.assign(response, {foo: bar})) 
} 

をまとめると同等であることを意味約束チェーンは、ことに注意してください。私たちは$ qの使用を好まず、控えめに使用します。 を持っていないブラウザをサポートする必要がある場合を除き、ES6 Promiseを使用することをお勧めします。角度の大部分は、すべてのサービスで

7

$http$qを使用し、最初の例は冗長であり、2番目の例も同じです。

return $http.get(config.apiHost + details.url); 

上記のコードの最初の部分と同じである:あなただけ$http.getリターンがその約束を返却する必要があります。

さらに、return msgdeferred.reject(msg)と同じではありません。同等に注意するthrow msgまたはreturn $q.reject(msg)

別のものになるでしょうあなたはthencatchを使用したい、successerrorは非標準であるということです。

+0

それを説明するための最も簡単な方法だろうとしますhttps://docs.angularjs.org/ API/NG /サービス/ $ HTTP – pulse0ne

+1

@あなたがA +約束のスペックの話をしている場合、彼らは*非標準装備されています* pulse0ne –

+0

@DanPantryああ、はい、私は誤って使用すると、角度$ HTTPサービスに言及して考えていました。スペックに関しては、それは非標準的であり、角度の人々がそれを非難した理由はほぼ確実です。 – pulse0ne

0

は約束を返しますが、あなたは$qを使用して独自の繰延オブジェクトを作成したいと思い、いくつかのインスタンスがあります。

ケース1

あなたが約束をサポートしていないか、または独自の機能を作成し、約束を返すようにしたいしているライブラリを使用しています。あなたは、デフォルトで約束を返しますが、あなたには、いくつかの条件のいくつかに基づいて個別の約束を返すようにしたい任意の構文を使用している

ケース2

:角度$httpリターンの約束だけでなく、今あなたがこの約束の応答がだけにして特定の値が含まれている場合、あなたが独自に作成する必要があり、その後解決され、他のリターンの失敗を返したいことしたい場合deffered objectとそれを解決するか失敗するかは、$http返された値に基づいて判断する必要があります。

+0

あなたはそれをする必要はありません。チェーンを約束します。 '$ http.get()。then(...)'と同じように簡単にできます。そして、 'then'から返された値はチェーン内の次の.thenに渡されます。このために独自の遅延オブジェクトを使用する必要はありません。 –

+0

私は$ http....の応答について話しています。応答に特定の値が含まれていて、約束を解決するか、ただ拒否するよりも、それを望むならば。 –

+1

この回答は不正確であり、一般的な繰延アンチパターンを説明しています – charlietfl

関連する問題

 関連する問題