如何将 withLatestFrom 与承诺一起使用?

How to use withLatestFrom with a promise?

为什么不能将 promise 转换为 observable,然后将其与 withLatestFrom 一起使用。我不清楚为什么这没有解决。

of('')
  .pipe(
    withLatestFrom(from(myPromise)),
    map((res) => {
      console.log('does not resolve', res);
    })
  )
  .subscribe();

WithLatestFrom 仅在其源 Observable 发出时才发出,因为 of('') 在源到 withLatestFrom 之前发出,所以你的 withLatestFrom 永远不会被触发。

以下代码将不起作用:

of('1 + 1')
  .pipe(
    withLatestFrom(new Promise(x => x("== 2"))),
    map(([res1,res2]) => console.log(res1, res2))
  )
  .subscribe();

但这将:

of('1 + 1')
  .pipe(
    delay(100), // <= delay source execution
    withLatestFrom(new Promise(x => x("== 2"))),
    map(([res1,res2]) => console.log(res1, res2))
  )
  .subscribe();

这是 withLatestFrom 的预期行为。源可观察对象在承诺解决之前同步完成(异步)。 withLatestFrom 仅在两个 observable 至少发射一次后才发射,然后仅在源 observable 发射时发射。

在您的例子中,源可观察对象在 promise 解析之前完成。

of('').pipe(
  delay(100),
  withLatestFrom(from(myPromise)),
  tap(res =>
    console.log('should resolve', res)
  )
).subscribe();

更新 #1:没有 delay

的解决方案

如果两个源 Observable 都发出一次并完成,那么 forkJoin 是最好的

forkJoin({
  addition: of(1 + 1),
  promise: from(myPromise)
}).pipe(
  map(({addition, promise}) => {return /* something */})
)

combineLatestforkJoin 类似,但它更适用于持续发出值的长期流。它等待其内部流全部开始发射,然后发射所有最新值。

combineLatest(
  of(1 + 1),
  from(myPromise)
).pipe(
  map(([addition, promise]) => {return /* something */})
)

或者,如果您想使用 withLatestFrom 并且您对时间限制感到满意。

from(myPromise).pipe(
  withLatestFrom(of(1+1)),
  map(([promise, addition]) => {return /* something */})
)

应该可以。