我正在使用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并在设置过程中处理错误?
答案 0 :(得分:1)
我建议使用defer
:
import { defer } from 'rxjs/observable/defer';
const obs = defer(() => {
const reader = ...
const writer = ...
return fromEvent(...);
});
defer
采用返回可观察对象的工厂函数。当对从defer
的调用返回的observable进行订阅时,将调用工厂函数。
如果工厂函数中发生错误,它将通过可观察流中的error
通知发出。