从静态方法中包装Observable以进行错误处理

时间:2018-03-07 00:19:38

标签: typescript rxjs

我正在使用RxJS进行某些文件处理 - 特别是我正在读取文件,进行一些处理,并写入另一个文件。 fromEvent静态Observable方法看起来很完美,因为我可以用它来挂钩流事件。

const reader = createReadStream(inputFile);
const writer = createWriteStream(outputFile);

fromEvent(reader, 'readable').pipe(
  map(() => reader.read()),
  processString(),
  tap(chunk => writer.write(chunk)),
  takeUntil(fromEvent(reader, 'close'))
).subscribe({
  error(err) { console.error(err); },
  complete() { console.log('done'); },
})

这很好用,但问题是如果在可观察流之外有一个错误(例如inputFile不存在),我无法使用Observables捕获它。我必须单独处理它。

为了解决这个问题,我将fromEvent创建包装在一个我没有真正使用的可观察对象中:

of(1).pipe(
  switchMap(() =>
    reader = ...
    writer = ...
    return fromEvent(...)

这样可行,但创建像这样的Observable以包装错误处理功能感觉很奇怪。有没有一种首选的方法来执行一些设置Observable并在设置过程中处理错误?

1 个答案:

答案 0 :(得分:1)

我建议使用defer

import { defer } from 'rxjs/observable/defer';

const obs = defer(() => {
  const reader = ...
  const writer = ...
  return fromEvent(...);
});

defer采用返回可观察对象的工厂函数。当对从defer的调用返回的observable进行订阅时,将调用工厂函数。

如果工厂函数中发生错误,它将通过可观察流中的error通知发出。