Typescript + RxJS로 fs.readFile 사용하기
in Javascript
Typescript + RxJS 환경에서 bindNodeCallback
함수를 사용하는 방법을 참고하기 위해 작성한다.
bindeNodeCallback
함수는 Callback 함수를 Observable
로 리턴하도록 매핑해주는 역할을 한다. 이를 이용해 fs.readFile
를 매핑해보자.
readfile
함수는 다음과 같이 선언되어 있다.
function readFile(path: PathLike | number,
options: { encoding: string; flag?: string; } | string,
callback: (err: NodeJS.ErrnoException | null, data: string) => void): void;
fs version: 0.0.1-security
이 함수의 parameter를 그대로 복사해서 fs.readFile
를 리턴하는 익명 함수의 인자에 넣어준다. (아래 코드에서 readFileStructure
)
readFileStructure
을 bindNodeCallback
의 argument로 넣어주면 끝이다.
자세한 내용은 코드를 참조하자.
import * as fs from 'fs';
import { bindNodeCallback, Observable } from 'rxjs';
export class RxCallbackService {
private readonly readFileCallback$: (...args: any[]) => Observable<any>;
constructor() {
const readFileStructure = (
path: string,
encoding: string,
callback: (err: NodeJS.ErrnoException | null, data: string | Buffer) => void,
) => fs.readFile(path, encoding, callback);
this.readFileCallback$ = bindNodeCallback(readFileStructure);
}
readFile$(path: string, encoding: string) {
return this.readFileCallback$(path, encoding);
}
}
// how to use
const rxCallbackService = new RxCallbackService();
const token$ = rxCallbackService.readFile$('token.json', 'utf-8'); // return Observable type
bindNodeCallback
을 사용할 때 항상 헷갈렸는데, 변환할 함수의 함수 structure
를 그대로 가져온다는 게 핵심이다.