如何将 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 */})
)
combineLatest
与 forkJoin
类似,但它更适用于持续发出值的长期流。它等待其内部流全部开始发射,然后发射所有最新值。
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 */})
)
应该可以。
为什么不能将 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 */})
)
combineLatest
与 forkJoin
类似,但它更适用于持续发出值的长期流。它等待其内部流全部开始发射,然后发射所有最新值。
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 */})
)
应该可以。