rxjs最终在promise解决之前执行

时间:2018-03-31 03:46:16

标签: javascript promise rxjs observable es6-promise

以下是我的代码的简化版本。问题是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

2 个答案:

答案 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合同规定总是只有一个completeerror通知。但是,如果你使用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')
)