我有两个来源: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/