【问题标题】:How to start second observable *only* after first is *completely* done in rxjs如何在第一个 * 完全 * 在 rxjs 中完成后开始第二个可观察的 *only*
【发布时间】:2015-11-15 13:17:00
【问题描述】:

我的印象是Observable.[prototype.]concat 确保第一个操作在第二个操作开始之前完全完成。但在以下代码中:

Observable
    .concat(
        Observable.fromNodeCallback(rimraf)(path.resolve('./some_dir')),
        Observable.fromNodeCallback(mkdir)(path.resolve('./some_dir')),
        writeToSomeDir$
    )

mkdirrimraf 完成删除目录之前尝试(但失败)创建./some_dir。然而,在(投掷)结束时,./some_dir 最终会被删除。

为什么Observable.concat 会出现这种行为?如何确保第一个 Observable 在开始使用第二个 Observable 之前完全完成,而不会落入 rimraf 的同步版本?

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:

    问题在于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$
        );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多