我有两个来源: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个组合响应?

最佳答案

您可以像这样使用 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演示了此链接。

关于javascript - CombineLatest()不能按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48287172/

10-12 14:21