combineLatest()无法按预期工作

时间:2018-01-16 17:53:49

标签: javascript rxjs electron

我有两个来源:saveDialog $和file $。第一个用于选择异步目录路径以保存由第二个源发出的文件。我想组合发出的值,以便我收到所有文件的一次拾取路径的组合。我曾尝试使用combineLatest(),而不是7个响应,我只有1个只有这样的最新文件:["path\to\dir", Object]。 ForkJoin也是如此。

这是我的代码:

    const saveDialog$ = Observable.bindCallback(
        remote.dialog.showOpenDialog
    )(saveOptions).map(
        dirName => dirName ? dirName[0] : ''
    ).shareReplay(1);

    saveDialog$.combineLatest(
        file$
    ).subscribe(
        data => console.warn(data)
    )

如果7个文件被激活(例如),如何获得7个组合响应?

2 个答案:

答案 0 :(得分:1)

您可以像这样使用combineAll

// Assume we emit 7 file names, starting immediately, but with some
// delay in between.
const file$ = Rx.Observable.timer(0, 300)
  .map(val => `file-${val}.png`)
  .take(7);

// Assume your path is emitted only after a bit of time has passed.
const saveDialog$ = Rx.Observable.of('path/')
  .delay(1000);

const result$ = saveDialog$
  // Map the path emission to the files observable.
  // This produces a higher-order observable.
  // To not lose the emitted path value, we map the emitted file
  // names together; instead of preparing the string here you
  // could also use
  //   file$.map(file => [path, file])
  .map(path => file$.map(file => `${path}${file}`))
  .combineAll();

您可以找到一个有效的例子here

作为旁注,这仅适用于冷观察者(您还没有指定您的观察者是否热门)。如果file$是热门观察者,则您需要通过ReplaySubject对其进行多播。 Here's一个证明这一点的链接。

答案 1 :(得分:0)

您可以使用concatMap等待saveDialog$发出目录,然后使用map()将排放设置为与使用combineLatest时相同的格式。< / p>

saveDialog$
  .concatMap(dir => file$.map(f => [dir, f]))
  .subscribe(data => console.warn(data))