以下是我的代码的简化版本。问题是finally块的执行时间比我想要的要早。我希望它只在所有其他Observable完成时执行。
let data1 = 'test1'
let data2 = 'test2'
const input = Rx.Observable.from([data1, data2])
.finally(() => {
console.log('end')
})
let output = input.concatMap((text) => {
let promise = Promise.resolve(text)
return Rx.Observable.fromPromise(promise)
})
output.subscribe((x) => {console.log(x)})
输出:
end
test1
test2
预期产出:
test1
test2
end
答案 0 :(得分:3)
您遇到的问题是Observable.from
会立即发出并完成所有操作。然后两个发射都在concatMap
内缓冲,但源已经完成,因此调用了finally
块。
您可以做的最简单的事情就是在finally
之后放置concatMap
块,因为它确实完成了:
const data1 = 'test1';
const data2 = 'test2';
const input = Observable.from([data1, data2]);
const output = input
.concatMap(text => Promise.resolve(text))
.finally(() => console.log('end'));
output.subscribe(console.log);
查看实时演示(开放式控制台):https://stackblitz.com/edit/rxjs5-hnesmn?file=index.ts
顺便说一句,如果您在.finally
之后确实需要Observable.from
,则无法获得所需的输出,因为.finally
在处理Observable.from
时被调用(已完成)或错误的),这与随后的链无关。换句话说,Observable.from
无法知道后续链何时完成。它甚至没有意义,因为Rx合同规定总是只有一个complete
或error
通知。但是,如果你使用eg。 Observable.from().finally().share()
那么你可以有多个订阅以及什么决定源Observable何时调用finally()
?它只能完成一次。
答案 1 :(得分:0)
尝试更改订阅逻辑,看看你是否得到了你想要的东西
output.subscribe(
(x) => {console.log(x)},
error => console.error(error),
() => console.log('Finally I have really reached the END')
)