[functional-js]エラーハンドル
19710 ワード
この文章は劉仁東の関数式プログラミングの授業内容を整理した.
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を用意します.()パイプラインを利用すると、エラーが発生しても安全にプログラムを合成して準備できるので、エラー制御が容易になります.
Reference
この問題について([functional-js]エラーハンドル), 我々は、より多くの情報をここで見つけました https://velog.io/@younoah/functional-js-errorHandleテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol