web-dev-qa-db-ja.com

AngularJSのHTTPpromiseオブジェクトとは何ですか?

私はAngularJSでHTTPpromiseオブジェクトを使用していますが、HTTP promiseオブジェクトが実際に何であるか、およびHTTPpromiseオブジェクトとAngularJSの従来のオブジェクトの違いについて明確な概念がありません。

誰か説明してもらえますか?

9
TanvirArjel

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

9
JCrook1121

約束は概念です。これは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に感謝します)。

3
Kris Molinari

_$http_ APIは、_$q_サービスによって公開される据え置き/プロミスAPIに基づいています。

1.then(successCallback, [errorCallback], [notifyCallback])

2.catch(errorCallback) – shorthand for promise.then(null, errorCallback)

3.finally(callback, notifyCallback)

_$q_ promiseメソッド

1
范锦钢