如何在rxjs中首先*完全*完成后才启动第二个observable * *

时间:2015-11-15 13:17:01

标签: javascript rxjs

我的印象是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的同步版本?

1 个答案:

答案 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$
    );