[functional-js]エラーハンドル



この文章は劉仁東の関数式プログラミングの授業内容を整理した.

async/awaitとパイプライン

async function f() {
  const r1 = await go(
    list,
    L.map(a => delay(a * a)),
    L.map(a => delay(a % 2)),
    L.map(a => delay(a + 1)),
    C.take(2),
    reduce((a, b) => delay(a + b))
  );

  const r2 = await go(
    list,
    L.map(a => delay(a * a)),
    L.filter(a => delay(a % 2)),
    reduce((a, b) => delay(a + b))
  );
  const r3 = delay(r1 + r2);
  return r3 + 10;
}

go(f([1, 2, 3, 4, 5, 6, 7, 8]), a => console.log(a, 'f함수'));
「パイプライン」および「async/await」を使用すると、2つのパイプラインがあり、処理結果を1回必要とする論理で使用できます.

同期エラーハンドル


エラー・ケース


入力されたパラメータ値が正しくない場合、

  • 値が
  • 関数で誤って推定された場合、
  • エラー処理

  • は、最大類似値
  • を返す.
  • エラー出力
  • // 예시
    function f(list) {
      return list
        .map(a => a + 10) 
        .filter(a => a % 2)
        .slice(0, 2);
    }
    console.log(f(null)) // 인자값이 잘못된 경우
    
    // try-catch로 에러시 최대한 비슷한 값인 빈 배열 리턴
    function f(list) {
      try {
        return list
          .map(a => adsfa) //함수내 에러, 하나의 콜스택에서 발생이므로 에러처리가 된다.
          .filter(a => a % 2)
          .slice(0, 2);
      } catch (e) {
        console.log(e)
        return [];
      }
    }

    非同期エラーハンドル

    async function f(list) {
      try {
        return await list
          .map(
            a =>
              new Promise(resolve => {
                resolve(JSON.parse(a)); // 문제발생!
              })
          )
          .filter(a => a % 2)
          .slice(0, 2);
      } catch (e) {
        console.log(e, 'error catch');
        return [];
      }
    }
    
    f(['0', '1', '2', '{']).then(console.log).catch(e => console.log(e));
    
    非同期で発生した部分ではプロセスをうまく処理できないため、async/await同期で作成してcatchしてもエラー処理はできません.
    したがって,FxJSパイプライン関数を用いることでエラー処理を簡略化できる.
    function f(list) {
      try {
        return go(
          list,
          map(
            a =>
              new Promise(resolve => {
                resolve(JSON.parse(a)); // 문제발생!
              })
          ),
          filter(a => a % 2),
          take(2)
        );
      } catch (e) {
        console.log(e, 'error catch');
        return [];
      }
    }
    
    console
      .log(f(['0', '1', '2', '{']))
      .then(a => log(a, '함수'))
      .catch(e => console.log('프로미스캐치', e));
    
    awaitでpromisを掛け、awaitでpromisを掛ける場合は、合成関数でエラーが発生してもKelisli方式で安全に合成し、promisを用意します.()
    パイプラインを利用すると、エラーが発生しても安全にプログラムを合成して準備できるので、エラー制御が容易になります.