AngularにおけるPromiseとObservableの違い

2024-08-30

AngularにおけるPromisesとObservablesの違い

PromisesObservablesは、JavaScriptにおける非同期処理を扱うための仕組みですが、その性質や使い方が異なります。

Promises

  • 静的な値
    一度生成されたPromiseの値は変更できません。
  • チェーン化
    Promisesは、then()メソッドを使用して、成功または失敗の後の処理をチェーン化することができます。
  • 単一の値を返す
    Promisesは、非同期処理が完了したときに、成功または失敗を表す単一の値(通常は、成功の場合は値、失敗の場合はエラー)を返すことを約束します。

Observables

  • 動的な値
    Observablesは、新しい値が配信されるたびに、購読者に通知することができます。
  • サブスクライブ
    Observablesは、subscribe()メソッドを使用して購読され、購読者が値を受け取るようになります。
  • 複数の値を返す
    Observablesは、時間の経過とともに複数の値を配信することができ、イベントストリームのような動作をします。

Angularにおける使用

  • Observables
    Angularの多くのコア機能、特にRxJSの機能を活用して、イベントストリーム、非同期処理、データフローの管理にObservablesが広く使用されています。
  • Observables
    複数の値を配信、購読が必要、動的な値。
  • Promises
    単一の値を返す、チェーン化が可能、静的な値。



PromisesとObservablesの例

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Data fetched successfully');
    }, 2000);
  });
}

fetchData()
  .then(data => {
    console.log(data   ); // Output: Data fetched successfully
  })
  .catch(error => {
    console.error(error);
  });
  • catch()メソッドを使用して、失敗時の処理を指定します。
import { fromEvent, interval } from 'rxjs';

// ボタンクリックイベントをObservableに変換
const buttonClick$ = fromEvent(document.getElementById('myButton'), 'click');

// 1秒ごとに値を配信するObservable
const interval$ = interval(1000);

// ボタンクリックイベントとインターバルを結合
const combined$ = buttonClick$.pipe(
  switchMap(() => interval$)
);

combined$.subscribe(value => {
  console.log(value);
});
  • subscribe()メソッドを使用して、Observableの値を購読します。
  • switchMap()を使用して、ボタンクリックイベントが発生するたびに、新しいインターバルObservableを配信します。
  • interval()を使用して、1秒ごとに値を配信するObservableを作成します。
  • fromEvent()を使用して、ボタンクリックイベントをObservableに変換します。
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
impo   rt { map, catchError } from 'rxjs/operators   ';

@Component({
  selector: 'app-my-component',
  templateUrl: './my-component.html',
  styleUrls: ['./my-component.css']
})
export class MyComponent implements O   nInit {
  data: any;
  error: string;

  constructor(private http: HttpClient) {}

  ngOnInit() {
    // Promisesを使った例
    this.http.get('https://api.example.com/data')
      .toPromise()
      .then(data => {
        this.data = data;
      })
      .catch(error => {
        this.error = error.message;
      });

    // Observablesを使った例
    this.http.get('https://api.example.com/data')
      .pipe(
        map(data => {
          return data;
        }),
        catchError(error => {
          this.error = error.message;
          return of(null);
        })
      )
      .subscribe(data => {
        this.data = data;
      });
  }
}
  • Observablesを使った例では、pipe()メソッドを使用して演算子をチェーンし、map()catchError()を使用してデータの変換とエラー処理を行っています。
  • Promisesを使った例では、toPromise()メソッドを使用してPromiseに変換し、then()catch()メソッドを使用しています。



Async/Await

  • Promiseベース
    内部的にはPromiseを使用していますが、より直感的な書き方ができます。
  • ES2017で導入された
    非同期処理を同期的なコードのように記述できる構文です。
async function fetchData() {
  try {
    const data = await fetch('https://api.example.com/data');
    const json = await data.json();
    console.log(json);
  } catch (error) {
    console.error(error);
  }
}

fetchData();

Generators

  • yieldキーワード
    値を返すたびに一時停止し、再開することができます。
  • ES6で導入された
    イテレーターを生成する関数です。
function* fetchData() {
  const data = yield fetch('https://api.example.com/data');
  const json = yield data.json();
  return json;
}

const generator = fetchData();
generator.next().then(result => {
  generator.next(result).then(result => {
    console.log(result.value);
  });
});

Callbacks

  • 複雑な処理
    複数のコールバックがネストされると、いわゆる「コールバック地獄」が発生する可能性があります。
  • 伝統的な方法
    非同期処理の完了時に呼び出される関数です。
function fetchData(callback) {
  setTimeout(() => {
    callback('Data fetched successfully');
  }, 2000);
}

fetchData(data => {
  console.log(data);
});

Angularにおける代替的なアプローチ

  • Callbacks
    Angularでは、古いコードやサードパーティライブラリとの互換性のために使用されることがあります。
  • Generators
    Angularでは直接使用されることは少ないですが、RxJSの内部実装で使用されています。
  • Async/Await
    Angularの多くの非同期操作で広く使用されています。
  • Callbacks
    伝統的な非同期処理の方法。
  • Generators
    イテレーターを生成する関数。
  • Async/Await
    Promiseをより直感的に扱うための構文。
  • Observables
    複数の値を配信するイベントストリーム。
  • Promises
    非同期処理の基礎となる仕組み。

angular promise rxjs



イベントループにおけるタスクの優先度

JavaScript のイベントループは、非同期処理を管理する重要なメカニズムです。その中で、マイクロタスクとマクロタスクという2つの概念が重要な役割を果たしています。マイクロタスク実行タイミング 各マクロタスクの処理が完了した後、イベントループはマイクロタスクキューにあるすべてのタスクを処理します。 マイクロタスクが新しいマイクロタスクをスケジュールした場合、それらも現在のイベントループのサイクル内で処理されます。...


Node.js Promise テスト入門

Node. js で Promise をテストする際、Mocha と Chai は強力なツールとなります。Mocha はテストフレームワークで、テストケースを記述し実行するための環境を提供します。Chai はアサーションライブラリで、期待する結果と実際の結果を比較し、テストが成功したかどうかを判断します。...


Android Studio adb エラー 解決

エラーの意味 このエラーは、Android StudioがAndroid SDK(Software Development Kit)内のAndroid Debug Bridge(adb)というツールを見つけることができないことを示しています。adbは、Androidデバイスとコンピュータの間で通信するための重要なツールです。...


Promiseチェーンでの値の受け渡し

Promiseチェーンとは、複数のPromiseを連結して、前のPromiseが解決された後に次のPromiseを実行するためのパターンです。このチェーンの中で、前のPromiseの結果にアクセスしたいことがあります。引数の名前は任意ですが、一般的にはresultやvalueなどが使用されます。...


Angularのスタイルバインディング解説

日本語Angularでは、テンプレート内の要素のスタイルを動的に変更するために、「Binding value to style」という手法を使用します。これは、JavaScriptの変数やオブジェクトのプロパティをテンプレート内の要素のスタイル属性にバインドすることで、アプリケーションの状態に応じてスタイルを更新することができます。...



SQL SQL SQL SQL Amazon で見る



jQuery DeferredsとPromisesの解説

jQueryのDeferredオブジェクトは、非同期操作の完了や失敗を管理するための仕組みです。このオブジェクトには、"promise"という概念が関連しています。Promiseは、Deferredオブジェクトの現在の状態(未解決、解決、失敗)を表すものです。


Angular バージョン確認方法

AngularJSのバージョンは、通常はHTMLファイルの<script>タグで参照されているAngularJSのライブラリファイルの名前から確認できます。例えば、以下のように参照されている場合は、AngularJS 1.8.2を使用しています。


Angular ファイル入力リセット方法

Angularにおいて、<input type="file">要素をリセットする方法は、主に2つあります。この方法では、<input type="file">要素の参照を取得し、そのvalueプロパティを空文字列に設定することでリセットします。IEの互換性のために、Renderer2を使ってvalueプロパティを設定しています。


Promiseのアンチパターンと回避方法

Explicit Promise Construction Antipatternとは、JavaScriptのPromiseオブジェクトを直接生成して処理を非同期化する手法です。このアプローチは、コードの可読性や保守性を低下させる可能性があります。


JavaScriptでPromiseの.then(success, fail)はいつアンチパターンになるのか?

JavaScript、Node. js、Promiseにおける. then(success, fail)は、非同期処理の処理結果を受け取るための一般的な方法です。しかし、状況によっては、.then(success, fail)の使用がアンチパターンと見なされる場合があります。