ホームページ >ウェブフロントエンド >jsチュートリアル >Angular の Promise オブジェクト ($q の導入)_AngularJS

Angular の Promise オブジェクト ($q の導入)_AngularJS

WBOY
WBOYオリジナル
2016-05-16 16:11:351544ブラウズ

JQuery を使用していたとき、Promise が JS 非同期プログラミング モデルであることは知っていましたが、JQuery の遅延オブジェクトとの違いはよく理解していませんでした。会社のプロジェクトが進行するにつれて、バックエンドからデータを受信する必要が生じたので、それを完了することにしました。

約束

Promiseは、階層の入れ子を避け、非同期イベントを同期操作プロセスの形で操作し、非同期イベントを連鎖的に操作できるモードです。

JavaScript の非同期コードを記述する場合、コールバックが最も単純なメカニズムであることはわかっていますが、このメカニズムを使用すると、制御フロー、例外処理、関数のセマンティクスが犠牲になり、コールバックの落とし穴に陥る可能性さえあります。 Promise はこの問題を解決します。

ES6 の Promise、AngularJS に組み込まれた AngularJS 組み込み Q、および Promises/A 仕様を採用する場合、次のようになります。

各タスクには、保留中、完了、拒否という 3 つのステータスがあります。

1.保留ステータス: 履行ステータスまたは拒否ステータスに移行できます。
2. 満たされた状態: 他の状態に変更することはできません。また、状態を変更することもできません。値が必要です。
3. 拒否された状態: 他の状態に変更することはできず、状態を変更することもできません。何らかの理由があるはずです。

状態の転送は 1 回限りであり、状態が満たされる (完了) または失敗する (失敗/拒否) と、再度変更することはできません。

コードをコピーします コードは次のとおりです:

関数 okToGreet(名前){
戻り名 === 'ロビンフッド';
}

function asyncGreet(name) {
var deferred = $q.defer();

setTimeout(function() {
// この非同期関数 fn は将来的に非同期で実行されるため、モデルの変更を正しく監視しながらコードを $apply 呼び出しにラップします
$scope.$apply(function() {
deferred.notify('「名前」さんに挨拶しようとしています。');

if (okToGreet(名前)) {
deferred.resolve('こんにちは、' name '!');
} else {
deferred.reject('挨拶「名前」は許可されていません。');
}
});
}, 1000);

deferred.promise を返します;
}

varpromise = asyncGreet('ロビンフッド');
promise.then(関数(挨拶) {
alert('成功: ' 挨拶);
}、関数(理由) {
alert('失敗: '理由);
}、関数(更新) {
alert('通知を受け取りました: ' 更新);
});

Q Promise の基本的な使い方

上記のコードは、$q.defer() によって構築された遅延インスタンスのいくつかのメソッドの役割を示しています。非同期操作が成功した場合は、resolve メソッドを使用して Promise オブジェクトのステータスを「成功」に変更します (つまり、保留中から解決済みに)。非同期操作が失敗した場合は、reject メソッドを使用してステータスを「失敗」に変更します。 (つまり、保留中から拒否されました)。最後に、deferred.promise が返され、連鎖的に then メソッドを呼び出すことができます。

JS にはネイティブ Promise があり、ES6 にはすでに Promise オブジェクトがあり、Firefox と Chrome 32 ベータ版には基本的な Promise API が実装されています

AngularJs の $q.deferd

$q.deferd を呼び出して、延期されたオブジェクトをチェーン呼び出しに返します。このオブジェクトは、API を通じて Promises/A 仕様の 3 つのタスク状態を関連付けます。

遅延 API

遅延オブジェクトのメソッド

1.resolve(value):solve()の宣言で、Promiseオブジェクトが保留状態から解決状態に変化することを示します。
2.reject(reason):solve()の宣言時に、Promiseオブジェクトが保留状態から拒否された状態に変化することを示します。
3.notify(value): Notice() が宣言されると、Promise オブジェクトの未履行状態を示し、解決または拒否する前に複数回呼び出すことができます。

遅延オブジェクトのプロパティ

promise: 最終的に返されるのは、元の遅延オブジェクトではなく、新しい遅延オブジェクトのpromise属性です。この新しい Promise オブジェクトは元の Promise オブジェクトの状態を監視することしかできず、タスクの状態が外部から変更されるのを防ぐために遅延オブジェクトの内部状態を変更することはできません。

Promise API

遅延インスタンスが作成されると、新しい Promise オブジェクトが作成され、deferred.promise を通じて参照を取得できます。

Promise オブジェクトの目的は、遅延されたタスクが完了したときに、関係する部分がその実行結果を取得できるようにすることです。

Promise オブジェクトのメソッド

1.then(errorHandler,fulfuledHandler,progressHandler): then メソッドは、Promise のさまざまな状態を監視するために使用されます。 errorHandler は失敗ステータスを監視し、fulfuledHandler は履行ステータスを監視し、progressHandler は未​​履行 (不完全) ステータスを監視します。さらに、通知コールバックは 0 回以上呼び出され、解決または拒否 (解決と拒否) の前に進行状況を示すことができます。
2.catch(errorCallback) - Promise.then(null, errorCallback)
のショートカット 3.finally(callback) - Promise が実行されるか拒否されるかを監視できますが、最終値は変更されません。 これは、Promise が拒否されたか解決されたかに関係なく、リソースを解放したり、未使用のオブジェクトをクリーンアップしたりするために使用できます。 詳細については、完全なドキュメント仕様を参照してください。

Promise チェーン呼び出しは then() メソッドを通じて実装できます。

コードをコピーします コードは次のとおりです:

約束B = 約束A.then(関数(結果) {
結果 1 を返します
});

//promiseB は、promiseA が処理された直後に処理されます。
// そして、その値 value は、promiseA を 1 増やした結果です

$q のその他のメソッド

$q.when(value): 変数値を渡し、promise.then() は成功したコールバックを実行します
$q.all(promises): 成功コールバックを実行するには、複数の Promise が正常に実行される必要があります。渡される値は配列またはハッシュ値です。配列内の各値は、Index
に対応する Promise オブジェクトです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。