[解決済み] Angular2 http.get()、map()、subscribe()とobservableパターン - 基本的な理解
質問
今、私は3つのリンクを持つ最初のページを持っています。最後の「friends」リンクをクリックすると、適切なフレンドコンポーネントが開始されます。その中で friends.jsonファイルに格納されている私の友人のリストを取得したいのです。 今のところ、すべてうまくいっています。しかし、私はRxJsのobservables、map、subscribeの概念を使ったangular2のHTTPサービスについてはまだ初心者なんです。私はそれを理解しようとし、いくつかの記事を読みましたが、私が実用的な仕事に入るまで、私はそれらの概念を適切に理解するつもりはありません。
ここで、私はすでにHTTP関連の作業を除いて動作しているplnkrを作りました。
myfriends.ts
import {Component,View,CORE_DIRECTIVES} from 'angular2/core';
import {Http, Response,HTTP_PROVIDERS} from 'angular2/http';
import 'rxjs/Rx';
@Component({
template: `
<h1>My Friends</h1>
<ul>
<li *ngFor="#frnd of result">
{{frnd.name}} is {{frnd.age}} years old.
</li>
</ul>
`,
directive:[CORE_DIRECTIVES]
})
export class FriendsList{
result:Array<Object>;
constructor(http: Http) {
console.log("Friends are being called");
// below code is new for me. So please show me correct way how to do it and please explain about .map and .subscribe functions and observable pattern.
this.result = http.get('friends.json')
.map(response => response.json())
.subscribe(result => this.result =result.json());
//Note : I want to fetch data into result object and display it through ngFor.
}
}
きちんとした指導と説明をお願いします。それは多くの新しい開発者にとってとても有益なことだと思います。
どのように解決するのですか?
以下は、あなたが間違った方向に進んでしまったところです。
this.result = http.get('friends.json')
.map(response => response.json())
.subscribe(result => this.result =result.json());
となるはずです。
http.get('friends.json')
.map(response => response.json())
.subscribe(result => this.result =result);
または
http.get('friends.json')
.subscribe(result => this.result =result.json());
あなたは2つの間違いを犯しています。
1- observable 自体を
this.result
. 実際に友達のリストを割り当てる場合は
this.result
. 正しいやり方は
-
observableをサブスクライブします。
.subscribe
は実際にobservableを実行する関数です。以下の3つのコールバック・パラメータを受け取る。.subscribe(success, failure, complete);
例えば
.subscribe(
function(response) { console.log("Success Response" + response)},
function(error) { console.log("Error happened" + error)},
function() { console.log("the subscription is completed")}
);
通常は、successコールバックから結果を受け取り、変数に代入します。
エラー・コールバックは自明である。
completeコールバックは、エラーなしで最後の結果を受け取ったかどうかを判断するために使用されます。
2- 2つ目の間違いは、あなたが
.json()
について
.map(res => res.json())
そして、observableのsuccessコールバックで再度呼び出した。
.map()
はトランスフォーマーで、結果をあなたが返すものに変換します (あなたの場合は
.json()
のコールバックに渡されます。
のどちらかで一度呼び出す必要があります。
関連
-
[解決済み] HTTPの "Host "ヘッダーとは何ですか?
-
[解決済み] サブドメインとドメイン間でCookieを共有する
-
[解決済み] ETagとヘッダーエクスパイアの比較
-
[解決済み] Angular HTTP GET with TypeScript エラー http.get(...).map is not a function in [null].
-
[解決済み】REST APIでPATCHとPUTのどちらを使うべきですか?
-
[解決済み】無効なデータに対するRESTレスポンスコード
-
[解決済み】http:// のリンクを全て // に変更することは可能ですか?
-
[解決済み】Angular 2 beta.17:プロパティ 'map' がタイプ 'Observable<Response>' に存在しない。
-
[解決済み】プロパティ 'map' が 'Observable<Response>' 型に存在しない。
-
[解決済み] ObservableがついにSubscribeに
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 負の配列サイズ例外
-
[解決済み] Google ChromeでSPDYを無効にする方法
-
[解決済み] HTTPポストで文字+が%2Bに変換される
-
[解決済み] 404ヘッダー - HTTP 1.0か1.1か?
-
[解決済み] application/x-www-form-urlencoded or multipart/form-data?
-
[解決済み】URLのアンパサンドのエスケープについて
-
[解決済み】エンティティボディを持たないHTTP POSTを実行することはバッドプラクティスとみなされますか?
-
[解決済み】Accept* HTTPヘッダのq=0.5とは何ですか?
-
[解決済み】HTTP1.1とHTTP2.0の違いは何ですか?[クローズド]
-
[解決済み] Angularでフォームの変更を監視する方法