Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将延迟添加到可观察到的;防止;结合withLatestFrom订阅_Javascript_Angular_Rxjs - Fatal编程技术网

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会失败。从你的描述来看,我希望它要么每次都失败,要么每次都成功。