我的印象是,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
返回值正在替换通常必须作为函数的最后一个参数传递的节点样式回调。但是,该函数仍然会立即被调用。
如果您想延迟方法的执行,可以将它们包装在 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$
);
关于javascript - 如何*仅*在第一个在 rxjs 中“完全”完成后启动第二个可观察的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33720112/