繁体   English   中英

如何在rxjs中“完全”完成“仅在第一次之后”才能开始第二次可观察

[英]How to start second observable *only* after first is *completely* done in rxjs

我的印象是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$
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM