我的印象是Observable.[prototype.] concat确保第一次操作在第二次操作开始之前完全完成.但是在以下代码中:
Observable
.concat(
Observable.fromNodeCallback(rimraf)(path.resolve('./some_dir')),
Observable.fromNodeCallback(mkdir)(path.resolve('./some_dir')),
writeToSomeDir$
)
在rimraf完成删除目录之前,mkdir尝试(并且失败)创建./some_dir.然而,在(抛出)结束时,./ some_dir最终被删除.
为什么Observable.concat会显示这样的行为?如何在开始使用第二个Observable之前确保第一个Observable完全完成而不会降低到rimraf的同步版本?
解决方法:
问题是fromNodeCallback
创建了一个函数,当被调用时,它执行底层函数并通过Observable返回调用的结果.本质上,Observable返回值正在替换您通常必须传递的节点样式回调作为函数的最后一个参数.但是,该函数仍会立即被调用.
如果你想延迟方法的执行,你可以推迟它们,以防止它们执行,直到Observables订阅.
var rimrafObservable = Observable.fromNodeCallback(rimraf);
var mkdirObservable = Observable.fromNodeCallback(mkdir);
Observable
.concat(
Observable.defer(() => rimrafObservable(path.resolve('./some_dir'))),
Observable.defer(() => mkdirObservable(path.resolve('./some_dir'))),
writeToSomeDir$
);