Javascript 将延迟添加到可观察到的;防止;结合withLatestFrom订阅
目前正试图让我的头脑明白这一点:Javascript 将延迟添加到可观察到的;防止;结合withLatestFrom订阅,javascript,angular,rxjs,Javascript,Angular,Rxjs,目前正试图让我的头脑明白这一点: import {Observable} from "rxjs"; import {delay, first, takeUntil, tap, withLatestFrom} from "rxjs/operators"; const obs1 = new Observable(s => s.next(1)).pipe(delay(1000)); const obs2 = new Observable(s => s.next(2)); obs2
import {Observable} from "rxjs";
import {delay, first, takeUntil, tap, withLatestFrom} from "rxjs/operators";
const obs1 = new Observable(s => s.next(1)).pipe(delay(1000));
const obs2 = new Observable(s => s.next(2));
obs2
.pipe(
withLatestFrom(obs1),
tap(() => console.log('tap'))
)
.subscribe(() => console.log('subscribe'));
“订阅”(因此“点击”)永远不会被记录。但是为什么呢
如果我从第一个可观察的对象中删除延迟
,一切都会正常工作。如果我改为combinelatetest([obs1,obs2])
一切正常
这是一个错误的再现,其中发送了2个HTTP请求。如果withLatestFrom
中的请求花费的时间太长,subscribe
从未发生过。使用combinelateest
时,一切都按预期工作(这意味着subscribe
在两个请求完成后进行)
如果
combinelatetest
修复了我的bug,我对此没有意见,但我想了解原因。文档中说:
在输出可观察对象发出值之前,所有输入可观察对象必须发出至少一个值
这是因为withLatestFrom()
是一个非阻塞运算符
obs2
发出第一个值,然后withLatestFrom()
将发出obs1
中的最新值,但没有最新值,因此不会发出任何信息
如果obs2
在obs1
之后发出第二个值,则会发出一个值
如果combineLatest修复了我的bug,我可以接受——但我想了解原因
combineLatest()
的工作原理不同,因为它在所有可观测对象发出一个值之后发出。我遇到了类似的问题,combineLatest()修复了它,谢谢!但有些事我还是不明白。在我的例子中,根据数据库表的大小,Observable问题需要一些时间才能发出。对于空表,查询需要约50毫秒,withLatestFrom()可以工作。对于一个200万条记录的表,它需要约330毫秒,并且withLatestFrom会失败。从你的描述来看,我希望它要么每次都失败,要么每次都成功。