RxJS Insight - ChoDragon9/posts GitHub Wiki

operatorλ₯Ό μ‚¬μš©ν•˜λ©΄ 항상 λ°μ΄ν„°λŠ” λΆˆλ³€ 객체가 λ§Œλ“€μ–΄ μ§€λ‚˜??

μ—¬κΈ° of operatorλ₯Ό 톡해 Observableλ₯Ό μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

const data$ = of({n: 1}, {n: 2}, {n: 3});

그리고 μžμ‹ μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ™€ 제곱λ₯Ό ν•˜λŠ” ν•¨μˆ˜λ₯Ό pipeλ₯Ό 톡해 λ°›μ•˜μŠ΅λ‹ˆλ‹€.

const identity$ = data$.pipe(map(v => v));
const div$ = data$.pipe(
  map((v) => {
    v.n = v.n * v.n;
    return v;
  })
);

μ—¬κΈ°μ„œ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ν•˜λ©΄ 이와 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμƒν–ˆλ“―μ΄ μ›ν•˜λŠ” 데이터λ₯Ό 얻을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

data$.subscribe(console.log);
// output { n: 1 }
// output { n: 2 }
// output { n: 3 }

identity$.subscribe(console.log);
// output { n: 1 }
// output { n: 2 }
// output { n: 3 }

div$.subscribe(console.log);
// output { n: 1 }
// output { n: 4 }
// output { n: 9 }

λ§Œμ•½μ— μˆœμ„œλ₯Ό λ’€μ§‘μ–΄μ„œ μ‹€ν–‰ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”?? λΆˆλ³€κ°μ²΄κ°€ μœ μ§€ λ κΉŒμš”?? μˆœμ„œλ₯Ό λ³€κ²½ν•΄ λ³΄λ‹ˆ λΆ€μˆ˜νš¨κ³Όκ°€ λ°œμƒν•˜λŠ” 것을 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

div$.subscribe(console.log);
// output { n: 1 }
// output { n: 4 }
// output { n: 9 }

identity$.subscribe(console.log);
// output { n: 1 }
// output { n: 4 }
// output { n: 9 }

data$.subscribe(console.log);
// output { n: 1 }
// output { n: 4 }
// output { n: 9 }

λˆ„κ΅¬λ„ data$λ₯Ό κ΅¬λ…ν–ˆμ„ λ•Œ λ³€κ²½λœ 값이 λ‚˜μ˜€λŠ” 것을 μ›ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” 것은 operatorλ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ 내뢀값은 곡유λ₯Ό ν•˜κ³  μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 즉, operator에 λ“±λ‘ν•˜λŠ” ν•¨μˆ˜λ„ λͺ¨λ‘ μˆœμˆ˜ν•¨μˆ˜λ‘œ μž‘μ„±μ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

identity$와 div$에 λͺ¨λ‘ μˆœμˆ˜ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ λ’€ κ²°κ³Όμž…λ‹ˆλ‹€.

const identity$ = data$.pipe(map(({n}) => ({n})));
const div$ = data$.pipe(map(({n}) => ({n: n * n})));
div$.subscribe(console.log);
// output { n: 1 }
// output { n: 4 }
// output { n: 9 }

identity$.subscribe(console.log);
// output { n: 1 }
// output { n: 2 }
// output { n: 3 }

data$.subscribe(console.log);
// output { n: 1 }
// output { n: 2 }
// output { n: 3 }

pipe 쀑간에 μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ μ–΄λ–»κ²Œ λ˜μ§€??

μ•ˆμ „ν•œ ν•¨μˆ˜ν•©μ„±μ„ μœ„ν•΄ λͺ¨λ‚˜λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 데, Observable은 μ—λŸ¬κ°€ λ°œμƒλ˜λ©΄ μ–΄λ–»κ²Œ μ²˜λ¦¬λ˜λŠ” 지 μ•Œμ•„λ³΄κΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ΄€λ‹€. μ•„λž˜ μ½”λ“œλ₯Ό 보면 μ •μ˜λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μ ‘κ·Όν•˜κ²Œ λ˜μ–΄ TypeErrorκ°€ λ°œμƒν•˜κ²Œ λ˜μ—ˆλ‹€.

const data$ = of({v: null}).pipe(
  map(({v: {v}}) => v)
);
data$.subscribe(console.log);
// output: TypeError: Cannot destructure property `v` of 'undefined' or 'null'.

λ§Œμ•½μ— μ˜΅μ Έλ²„μ— error ν•¨μˆ˜λ₯Ό λ°›μœΌλ©΄ μ–΄λ–»κ²Œ 될까? λ†€λžκ²Œλ„ Throw둜 λ˜μ Έμ§€λŠ” 것은 λͺ¨λ‘ error ν•¨μˆ˜μ— λ“€μ–΄μ˜¨λ‹€. Throwλ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•Šκ³  error ν•¨μˆ˜λ₯Ό 톡해 처리λ₯Ό κ°€λŠ₯ν•˜λ„λ‘ ν•  수 μžˆλ‹€.

const data$ = of({v: null}).pipe(
  map(({v: {v}}) => v)
);
const observer = {
  next: console.log,
  error: () => (console.log('Error!'))
};
data$.subscribe(observer);
// output: Error!