Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.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 主题与弹性逻辑工作流_Javascript_Typescript_Reactive Programming_Rxjs_Frp - Fatal编程技术网

Javascript 主题与弹性逻辑工作流

Javascript 主题与弹性逻辑工作流,javascript,typescript,reactive-programming,rxjs,frp,Javascript,Typescript,Reactive Programming,Rxjs,Frp,我希望能够更好地理解当与弹性运算符(即和)一起使用时,受试者的预期行为 下面的代码示例与JSBin对应的代码示例(在示例链接中找到)略有不同,因为我使用了箭头函数和类型以便于使用,这是使用版本4.0.0-4.0.7 我预期的弹性行为可以用以下方式表达: 如果使用subjectSelector而不是直接为每个新订阅传递subject,则将调用subjectSelector并创建一个新的ConnectableObservable(第11行) 在这一点上,我不确定共享(通过一些缓存)和处理(当检测到错

我希望能够更好地理解当与弹性运算符(即和)一起使用时,受试者的预期行为

下面的代码示例与JSBin对应的代码示例(在示例链接中找到)略有不同,因为我使用了箭头函数和类型以便于使用,这是使用版本4.0.0-4.0.7

我预期的弹性行为可以用以下方式表达:

如果使用subjectSelector而不是直接为每个新订阅传递subject,则将调用subjectSelector并创建一个新的ConnectableObservable(第11行)

在这一点上,我不确定共享(通过一些缓存)和处理(当检测到错误时)主题是否真的会给订阅者多播

为了达到这一点,我还编写了一个可恢复的ReplaySubject,其中我在处理时去掉了错误状态,这更多是为了测试,并且希望RxJS团队有一个很好的理由加入这个工作流

如果您有任何关于这个主题的指导和经验,我们将不胜感激


谢谢

shareReplay
当涉及到错误和完成时,主题具有不同的语义。例如,即使基础observable已完成(
refCount==0
),也不会完成
shareReplay
,因此对它的进一步调用将产生(replay)过去的值。Cf.(shareReplay)vs.(share)

否则,您将看到关于
shareReplay
(讨论您的问题)与其他运营商的行为的解释:

  • (这是一个漫长的讨论,从2015年11月4日jhusain发表评论开始)
提出的解决方案正是为多播运营商使用工厂函数。在任何情况下,尝试你的新设计并看看它是否有效都不太难

Rx.Observable
  .interval(1000)
  .flatMap( (count:number) => { 
    return count === 4 ? Rx.Observable.throw('Break') : Rx.Observable.return(count);
  })
  .retry()
  .take(5);

 Output 
 // 0
 // 1
 // 2
 // 3 
 // 0 <-- Retry means we start again from scratch (expected)
const consumer : Rx.Observable<number> = Rx.Observable
  .interval(1000)
  .flatMap( (count:number) => { 
    return count === 4 ? Rx.Observable.throw('Break') : Rx.Observable.return(count);
  })
  .shareReplay(1) /* multicast(new Rx.ReplaySubject(1)).refCount() */
  .retry()
  .take(5);

const firstSubscriber : Rx.Disposable = consumer.subscribe( (next:number) => {
   console.log('first subscriber: ' + next);
});

setTimeout(() => {
   firstSubscriber.dispose(); /* Lets start fresh in that refCount === 0 */
   const secondSubscriber : Rx.Disposable = consumer.subscribe( (next) => {
      console.log('second subscriber: ' + next);
   });
}, 5000 );

Output (before error is thrown)
// "first subscriber: 0"
// "first subscriber: 1"
// "first subscriber: 2"
// "first subscriber: 3"
Output (after error is thrown)
// "first subscriber: 3"
// "second subscriber: 3"
// "second subscriber: 3"
// "second subscriber: 3"
// "second subscriber: 3"
// "second subscriber: 3" 
.multicast( () => new Rx.ReplaySubject(1), (source:Rx.ConnectableObservable) => source );
var source = Rx.Observable
      .interval(100)
      .take(5)
      .shareReplay()

var first = source.subscribe( function(next) {
  console.log('first subscriber: ' + next);
});

setTimeout(function() {
//  first.dispose();
  var second = source.subscribe( function(next) {
  console.log('second subscriber: ' + next);
});

}, 1000 );