我的印象是Observable.[prototype.]concat
确保在第二次操作开始之前第一次操作完全完成。但是在下面的代码中:
Observable
.concat(
Observable.fromNodeCallback(rimraf)(path.resolve('./some_dir')),
Observable.fromNodeCallback(mkdir)(path.resolve('./some_dir')),
writeToSomeDir$
)
mkdir
尝试(并且失败)在./some_dir
删除目录之前创建rimraf
。但是,在投掷结束时,./some_dir
最终会被删除。
为什么Observable.concat
会出现这种行为?如何在开始使用第二个Observable之前确保第一个Observable完全完成而不会降低到rimraf的同步版本?
答案 0 :(得分:2)
问题是fromNodeCallback
创建了一个函数,当被调用时,它执行底层函数并通过Observable
返回调用的结果。本质上,Observable
返回值正在替换您通常必须传递的节点样式回调作为函数的最后一个参数。但是,该函数仍会立即被调用。
如果您想延迟方法的执行,可以将它们包装在defer
中,以防止它们在订阅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$
);