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