toPromise 没有 return 最后观察到的值

toPromise doesn't return last observed value

这里是一个可以 运行 与 ts-node 的例子。为什么结果2显示的是值而不是3.

import { interval, Subject } from 'rxjs';
import { startWith, takeUntil, tap, map } from 'rxjs/operators';

const done = new Subject();
let times = 0;

function test() {
  return interval(5000).pipe(
    startWith(0),
    map(() => times++ ),
    tap(n => {
      console.log(n);
      if (n === 3) {
        done.next();
      }
    }),
    takeUntil(done),
  ).toPromise();
}

test().then(n => {
  console.log('result: ', n);
}).catch(err => {
  console.error('error: ', err.message);
});

输出是:预期结果:3

0
1
2
3
result:  2

这是因为 takeUntil : Emits the values emitted by source Observable until a notifier Observable emits a value. 所以当你调用 [= 的 next 方法时17=] 你实际上停止了发射并完成了那个可观察的,所以最后 '3' 永远不会被发射。 This 是一个很好的例子,与您的案例非常相似,它展示了 takeUntil 行为。 如果您想发出“3”,也许您可​​以将条件更改为:

if (n > 3) {
   done.next();
 }