javascript - 如何*仅*在第一个在 rxjs 中“完全”完成后启动第二个可观察的

标签 javascript 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$
    );

关于javascript - 如何*仅*在第一个在 rxjs 中“完全”完成后启动第二个可观察的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33720112/

相关文章:

JavaScript 使用文档编写

Angular 2 : Chain http requests with concat()

javascript - 如何通过一个区间从服务器获取数据?

angular - 在 Angular8 中检测多个 ajax 请求状态的最佳专业方法是什么?

javascript - 函数没有被调用,我需要 window.load 吗?

javascript - 如何在 jQuery Datepicker ui 中阻止多个日期范围

javascript - VueJS 抛出错误,因为一些数据还没有准备好

javascript - 使用 page.js 进行 ASP.NET 客户端路由

angular - @ngrx/store pre-load guard catch 错误

angular - 显示来自 angularfire2 查询的单个项目