私はAngularJSでHTTPpromiseオブジェクトを使用していますが、HTTP promiseオブジェクトが実際に何であるか、およびHTTPpromiseオブジェクトとAngularJSの従来のオブジェクトの違いについて明確な概念がありません。
誰か説明してもらえますか?
Promiseは、非同期操作の概念です。基本的には、現在から将来の任意の時点で使用できるオブジェクトを表します。
3つの状態があります。
Promiseの状態は、then()とcatch()の2つのメソッドで処理します。
then()は、成功した場合に非同期呼び出しから期待されるオブジェクトを提供し、catch()はエラーを処理できるようにします。
Promiseを使用する可能性のあるシナリオは、次のようなネットワーク通話を行う場合です。
getData(): Promise<Array<string>> {
return this.http.get("http://a-test-api.com/api/getdata").toPromise();
}
次に、次のように使用します。
this.getData().then(function (stringArray) {
self.data = stringArray;
});
コンセプトの詳細については、こちらをご覧ください: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise
約束は概念です。これはAngularJSPromisesに関する質問であり、他のPromiseとは少し異なりますが、ライブラリ全体の概念は基本的に同じです。
これが何であるかを知っている場合は、それをスキップして次のヘッダーを読んでください。それ以外の場合は、次のようにします。
コードがある場合、通常は次のように順番に実行されます。
_object.method() // First,
variable = "something"; // Second,
for(var i=0; i<2; i++) {
resp = object.makeHttpRequest();
console.log(resp.data + " was #" + i);
} // Third,
console.log("Done"); // Last.
_
各ステップは、前のステップが終了した後に実行されます。これは、そのfor
ループに長い時間がかかる場合に問題になる可能性があります(HTTPリクエストに長い時間がかかると想像してください)。リクエストは、HTTPリクエストが終了するまでプロセス全体をハングさせます。ひどい。
Node.js デフォルトでは、コールバックパターンを使用してこれを処理します。 blocking(ディスク上のファイルの読み取りやHTTPリクエストの作成など、時間がかかる)である関数を呼び出すと、コールバック関数終了後に呼び出します。ブロッキング関数からのデータを使用して関数をapply
します終了時。これにより、そのブロッキング関数が終了している間に他のコードを実行できます。
多くのNode.js開発者が言うように、このコードは非常に乱雑になり、非常に速くなる可能性があります。代わりに、AngularJS(およびその他のライブラリ)は、コードがいつ終了するかについてのPromiseを返します。 Promise Pattern を使用できます。
Promiseは、概念的にはコールバックに似ていますが、はるかにクリーンで、より高度な制御が可能です。このことを考慮:
_var url = getUrlFunction();
makeHttpRequest(url, function onResponse(data) {
dataHandler(data);
console.log("done");
}, function onError(err) {
errHandler(err);
console.log("uh oh");
});
showTheUserWeAreLoading();
// Or in node.js
var url = getUrlFunction();
makeHttpRequest(url, function onResponse(err, data) {
(err) ? handleErr(err): null;
dataHandler(data);
console.log("done");
});
showTheUserWeAreLoading();
_
showTheUserWeAreLoading
関数が実行された場合、HTTPリクエストの前に(時々)発生することはあまり直感的ではありません。これは、あなた自身のコードを再読するときに望まれることがたくさん残っています。
同じコードですが、makeHttpRequest
を使用するとpromiseが返されます。
_var url = getUrlFunction(), prom = makeHttpRequest(url);
showTheUserWeAreLoading();
prom.then(function onSuccess(data) {
dataHandler(data);
console.log("done");
}, function onError(err) {
errHandler(err);
console.log("uh oh");
});
_
Promiseオブジェクトは、操作の状態を追跡するのに役立ちます。操作がFulfilledまたはRejectedの2つの状態のいずれかに達したときのハンドラーを割り当てます。
makeHttpRequest
は、AngularJSの$http()
またはjQueryの_$.ajax
_の代用であることに注意してください。 promiseの標準が作成される前に ECMAScript標準で 、各ライブラリ(およびライブラリバージョン)は、使用する必要がある/使用できるパターンについて独自の意見を持っていました。 AngularJSは以前は.success(<function>).error(<function>)
命名パターンを使用していましたが、jQueryは.done(<function>).fail(<function>)
を使用していました。これらの命名スキームは非常に昔に減価償却されているため、ライブラリ間の現在の違いは目立たなくなります(ECMAScriptに感謝します)。
_$http
_ APIは、_$q
_サービスによって公開される据え置き/プロミスAPIに基づいています。
1.then(successCallback, [errorCallback], [notifyCallback])
2.catch(errorCallback) – shorthand for promise.then(null, errorCallback)
3.finally(callback, notifyCallback)