首先连接主体和可观察量之间有什么区别,因为它们都是异步的?

问题描述 投票:0回答:1

我有一个代码,我试图将一个主题连接到一个可观察的区间?让我在这里发布代码 -

# CODE 1 #

const subject = new Subject();
    
// Connect the subject to the observable
interval(1000).subscribe(subject); //**Line 1**
 
subject.subscribe((value: any) => {
  console.log(`Subscriber A: Value: ${value}`);
});
 
setTimeout(() => {
   subject.subscribe((value: any) => {
       console.log(`Subscriber B: Value: ${value}`);
    });
}, 3000);
 
# END OF CODE 1 #
 
# OUTPUT 1 #
Subscriber A: Value: 0        
Subscriber A: Value: 1        
Subscriber A: Value: 2        
Subscriber A: Value: 3        
Subscriber B: Value: 3        
Subscriber A: Value: 4        
Subscriber B: Value: 4       
Subscriber A: Value: 5        
Subscriber B: Value: 5

这个输出正是我所期望的。但现在我发布另一个代码。我刚刚更改了将主题与可观察的连接线的位置。

# CODE 2 #

const subject = new Subject();
 
subject.subscribe((value: any) => {
   console.log(`Subscriber A: Value: ${value}`);
});
 
setTimeout(() => {
  subject.subscribe((value: any) => {
    console.log(`Subscriber B: Value: ${value}`);
  });
}, 3000);
    
// Connect the subject to the observable
interval(1000).subscribe(subject); //**Line 1**
 
# END OF CODE 2 #
 
# OUTPUT OF CODE 2 #
Subscriber A: Value: 0
Subscriber A: Value: 1
Subscriber A: Value: 2
Subscriber B: Value: 2
Subscriber A: Value: 3
Subscriber B: Value: 3
Subscriber A: Value: 4
Subscriber B: Value: 4
Subscriber A: Value: 5
Subscriber B: Value: 5

对于这个输出我有一些疑问。

疑问

  1. 为什么改变第1行的位置,输出会有差异?

  2. 在输出 2 中,为什么订阅者 B 从值 2 开始。难道它不应该像输出 1 一样从值 3 开始吗,因为这两种情况都有 3 秒的延迟?我在这里缺少什么重要的东西。

我尝试了代码 1 和代码 2,并期待输出 1。我对输出 2 有疑问,我想了解这种行为背后的根本原因是什么?

angular typescript asynchronous rxjs observable
1个回答
0
投票

调用代码需要时间,在第一种情况下,

1000
毫秒计时器启动 立即,

  • 0 发射(约 1000 毫秒)
  • 发出 1 次(约 2000 毫秒)
  • 2 发出(约 3000 毫秒)
  • 订阅 B(约 3010 毫秒)。

Subscriber B
很可能会与第三个值 (
2
) 相差几毫秒。

在第二种情况下,首先开始的是

3000
ms,因此它将收到值

  • 0 发射(约 1010 毫秒)
  • 发出 1 个(约 2010 毫秒)
  • 订阅B(~ 3000ms)
  • 2 发出(约 3010 毫秒)(此时两个日志)
© www.soinside.com 2019 - 2024. All rights reserved.