подчинять методы с обратными вызовами - PullRequest
0 голосов
/ 20 марта 2020

Я часто использую метод promisify , который преобразует метод с сигнатурой обратного вызова (например, fucntion fn(cb) { ... }) в метод, который возвращает Promise. Это может сделать исходный код намного чище и компактнее. Пока все хорошо.

Немного отличны методы, у которых есть метод обратного вызова, но обратный вызов вызывается несколько раз. В этом случае Promise не может выполнить свою задачу, потому что обещание может быть выполнено только один раз.

Теоретически, эти методы могут вернуть Subject. (например, BehaviorSubject), который затем будет запущен несколько раз.

Это заставило меня задуматься: Есть ли где-нибудь метод subjectify, который может сделать это для меня?

Например: это может быть полезно, когда есть метод, который анализирует большой документ. Чтобы сообщить о своем прогрессе, он мог бы использовать метод обратного вызова. Но завернуть его в Subject может быть удобнее.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Есть оператор, который помогает вам преобразовать обратный вызов в наблюдаемый https://rxjs-dev.firebaseapp.com/api/index/function/fromEventPattern

, но вы можете довольно легко интегрировать объект обратного вызова, как показано ниже

const progress=new Subject()
myEvent.on('progress', (p)=>{
   progress.next(p)
})
0 голосов
/ 20 марта 2020

Возможно, вы захотите создать Observable в случаях, когда ваш обратный вызов вызывается повторно, и вы хотите уведомить поток событий в результате вызываемого обратного вызова.

Давайте рассмотрим, в качестве примера, функция node readline, которая принимает обратный вызов, который запускается при каждом чтении строки, и второй обратный вызов, который вызывается при достижении конца файла.

В этом случае мы можем создать Observable, который генерирует для каждая строка читается и завершается при достижении конца, как в следующем примере

    function readLineObs(filePath: string) => {
        return new Observable(
            (observer: Observer<string>): TeardownLogic => {
                const rl = readline.createInterface({
                    input: fs.createReadStream(filePath),
                    crlfDelay: Infinity,
                });

                rl.on('line', (line: string) => {
                    observer.next(line);
                });
                rl.on('close', () => {
                    observer.complete();
                });
            },
        );
    };
...