Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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 Subject.pipe(last())与ReplaySubject(1)的比较?_Javascript_Typescript_Rxjs - Fatal编程技术网

Javascript Subject.pipe(last())与ReplaySubject(1)的比较?

Javascript Subject.pipe(last())与ReplaySubject(1)的比较?,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,从观察者的角度来看,使用带有last()操作符的Subject是否与使用ReplaySubject(1)相同 换句话说,在这种情况下: let s1 = new Subject<any>().pipe(last()); let s2 = new ReplaySubject<any>(1)(); 让s1=newsubject().pipe(last()); 设s2=新的ReplaySubject(1)(); 因此,在这种情况下,如果s1和s2的序列源相同,那么s1和s2

从观察者的角度来看,使用带有
last()
操作符的
Subject
是否与使用ReplaySubject(1)相同

换句话说,在这种情况下:

let s1 = new Subject<any>().pipe(last());
let s2 = new ReplaySubject<any>(1)();
让s1=newsubject().pipe(last());
设s2=新的ReplaySubject(1)();

因此,在这种情况下,如果
s1
s2
的序列源相同,那么
s1
s2
的订户将看到相同的值序列?

否,它们不会做相同的事情

last的目的是阻止一个可观察对象发出任何东西,直到该可观察对象完成为止,在该点上它立即发出最后一个值是什么。任何想看到最后一个值的人都必须在它出现之前订阅

ReplaySubject的目的是能够延迟订阅。在ReplaySubject(1)中,如果有人在observable发出东西一段时间后订阅了它,他们将立即得到最近发出的1东西的回放

例1:

let subject = new Subject();
let s1 = subject.pipe(last());
s1.subscribe(val => console.log('first subscription', val));
subject.next(1);
subject.next(2);
subject.next(3);
subject.complete();
s1.subscribe(val => console.log('second subscription', val));
在上面的示例中,您将看到它注销“first subscription 3”,而没有其他内容

例2:

let s2 = new ReplaySubject(1);
s2.subscribe(val => console.log('first subscription', val));
s2.next(1);
s2.next(2);
s2.next(3);
s2.complete();
s2.subscribe(val => console.log('second subscription', val));

在示例2中,您将看到它注销“第一次订阅1”、“第一次订阅2”、“第一次订阅3”和“第二次订阅3”

否,它们不会执行相同的操作

last的目的是阻止一个可观察对象发出任何东西,直到该可观察对象完成为止,在该点上它立即发出最后一个值是什么。任何想看到最后一个值的人都必须在它出现之前订阅

ReplaySubject的目的是能够延迟订阅。在ReplaySubject(1)中,如果有人在observable发出东西一段时间后订阅了它,他们将立即得到最近发出的1东西的回放

例1:

let subject = new Subject();
let s1 = subject.pipe(last());
s1.subscribe(val => console.log('first subscription', val));
subject.next(1);
subject.next(2);
subject.next(3);
subject.complete();
s1.subscribe(val => console.log('second subscription', val));
在上面的示例中,您将看到它注销“first subscription 3”,而没有其他内容

例2:

let s2 = new ReplaySubject(1);
s2.subscribe(val => console.log('first subscription', val));
s2.next(1);
s2.next(2);
s2.next(3);
s2.complete();
s2.subscribe(val => console.log('second subscription', val));

在示例2中,您将看到它注销“第一个订阅1”、“第一个订阅2”、“第一个订阅3”和“第二个订阅3”以添加到这个答案中:有时您会遇到与ReplaySubject有关的问题:当您在其上执行管道时,它将返回一个可观察的而不是ReplaySubject

因此,要让您的可观察对象始终返回最后一个值,您可以使用shareReplay操作符

ReplaySubjects和shareReplay的用例是通知延迟订阅的订阅者以前的值。Last()不提供此功能

let subject = new Subject();
let s1 = subject.pipe(shareReplay(1));

再补充一点:有时候,您会遇到与ReplaySubject有关的问题:当您对其执行管道操作时,它将返回一个可观察对象,而不是ReplaySubject

因此,要让您的可观察对象始终返回最后一个值,您可以使用shareReplay操作符

ReplaySubjects和shareReplay的用例是通知延迟订阅的订阅者以前的值。Last()不提供此功能

let subject = new Subject();
let s1 = subject.pipe(shareReplay(1));
啊-明白了!所以last()只在主题完成后才起作用。那很有帮助-谢谢。啊-明白了!所以last()只在主题完成后才起作用。这很有帮助,谢谢。