Javascript RxJS-Observable在第一次调用时未使用.next()发出值

Javascript RxJS-Observable在第一次调用时未使用.next()发出值,javascript,rxjs,observable,Javascript,Rxjs,Observable,我在RxJS上有些挣扎。我有3个可观察的物体。第一个Observable在单击文档时发出一个值,并立即完成(有意)。第二个Observable侦听第一个$Observable并映射这些值。最后,第三个Observable与第二个$Observable合并,最后一个元素由第一个$发出 通过查看代码更容易理解: const somethingHappened = true; const first$ = Observable.create(observer => { document.a

我在RxJS上有些挣扎。我有3个可观察的物体。第一个Observable在单击文档时发出一个值,并立即完成(有意)。第二个Observable侦听第一个$Observable并映射这些值。最后,第三个Observable与第二个$Observable合并,最后一个元素由第一个$发出

通过查看代码更容易理解:

const somethingHappened = true;

const first$ = Observable.create(observer => {
  document.addEventListener('click', e => {
    console.log('document clicked!')
    if (somethingHappened) {
      observer.next(5)
      observer.complete()
    } else {
      observer.next(5)
    }
  })
})

const second$ = first$.pipe(
  map((a: number) => a * 10),
)

const third$ = second$.pipe(
  concat(first$.pipe(last(), map(element => console.log('last element:', element)))),
)

third$.subscribe()
演示:(单击文档并查看控制台)

事实上,正在发生的事情真的很有趣。在第一次单击文档之后,我希望第三个$observable可以完成,因此,
console.log('last element:',element)
应该启动。相反,只有
console.log('documentclicked!')
触发

下一次单击文档后,
console.log('document clicked!')
激发两次,
console.log('last element:',element)
激发一次

有人能给我解释一下那里发生了什么事吗

在第一次单击文档后,我希望第三次$observable能够完成

为了完成第三个$,第二个$和
concat()
的所有参数都需要完成。
concat()
的参数:

是一个全新的Observable,只有在
第二次$
完成后才能订阅——因此您的文档上安装了第二个单击处理程序

如果向可观察函数添加一些日志输出:

const first$ = Observable.create(observer => {
    console.log('subscribed', Date.now()); // Add this
    document.addEventListener('click', e => {
      ...
您将看到两条日志“已订阅”消息。当页面加载时(在调用
third.subscribe()
之后)和第一次单击文档后(当
concat()
订阅其参数时)再次调用

const first$ = Observable.create(observer => {
    console.log('subscribed', Date.now()); // Add this
    document.addEventListener('click', e => {
      ...