LoginSignup
1
1

More than 3 years have passed since last update.

五億年ぶりに JavaScript を書いてみたら Observable や Promise や async, await のことが何もわからなくなっていたので次の五億年後に忘れてても思い出せるようにここに記す

Posted at

Observable とは

  • Observer パターンの Subject
  • subscriber へ値を publish する処理が本体で、subscriber が subscribe すると処理が実行される
  • サーバーにリクエストを出して受け取ったレスポンスを publish する処理を Observable で実装し、レスポンスを扱う処理を subscriber で実装したりする
// Observable の作成
const observable = new Observable(subscriber => {
  // subscriber に値 1 を publish する
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);
  setTimeout(() => {
    subscriber.next(4);
    // subscriber に処理の終了を通知する
    subscriber.complete();
  }, 1000);
});

console.log('just before subscribe');
// subscriber の定義
observable.subscribe({
  // Observable から publish した値を処理する
  next(x) { console.log('got value ' + x); },
  // エラーハンドリング
  error(err) { console.error('something wrong occurred: ' + err); },
  // 終了時の処理
  complete() { console.log('done'); }
});
console.log('just after subscribe');

Promise とは

  • 非同期で実行される処理のオブジェクト
  • 非同期で実行される処理が本体で、then あるいは catch メソッドで成功時あるいは失敗時の返り値を処理することができる
// Promise の作成
const promise = new Promise((resolve, reject) => {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', 'http://example.com');
  // resolve で成功時のコールバック関数を実行する
  xhr.onload = () => resolve(xhr.responseText);
  // reject で失敗時のコールバック関数を実行する
  xhr.onerror = () => reject(xhr.statusText);
  xhr.send();
});
// Promise の利用
promise
  // then で成功時のコールバック関数を定義する
  .then((res) => { console.log(res); })
  // catch で失敗時のコールバック関数を定義する
  .catch((e) => { console.log('ERROR: ' + e); });

async, await とは

  • Promise を扱うためのシンタックスシュガー
  • async function として定義された関数を実行すると Promise を返す
    • トップレベル関数で非同期関数の定義ができて便利
  • await promise() として Promise を実行すると Promise の終了まで処理を待つ
    • 実行したい Promise が複数あったとき then でチェーンするよりも読みやすい
// async を使わずに Promise を返す関数を定義する
function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

// async を使うと Promise を返す関数の定義が簡単
async function asyncCall() {
  console.log('calling');
  // await を使って Promise の実行を待つ
  const result = await resolveAfter2Seconds();
  console.log(result);
  // expected output: 'resolved'
}

asyncCall();

参考資料

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1