ReplaySubject“完成”时发出信号

时间:2018-02-15 03:23:10

标签: rxjs rxjs5 angular-observable

我正在试图找出一个表示ReplaySubject当前为“空”的好方法。

model_conv = torchvision.models.vgg19(pretrained=True)
for param in model_conv.parameters():
    param.requires_grad = False

model_conv = nn.Sequential(*list(model_conv.classifier.children())[:-1] +
                     [nn.Linear(in_features=4096, out_features=2)])
if use_gpu:
    model_conv = model_conv.cuda()

criterion = nn.CrossEntropyLoss()

optimizer_conv = optim.SGD(model_conv._modules['6'].parameters(), lr=0.001, momentum=0.9)
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_conv, step_size=7, gamma=0.1)

model_conv = train_model(model_conv, criterion, optimizer_conv, exp_lr_scheduler, num_epochs=25)

每次调用构造函数时,它都会重放主题中的所有项目。但是我的问题是 - 是否有一些我们可以听的事件,告诉我们主题什么时候变空?

我能想到的唯一一件事是在主题完成后发起自定义/不同的事件,如下所示:

import {ReplaySubject} from 'rxjs/ReplaySubject';
const rs = new ReplaySubject<Object>();

 // ...
constructor(){
  this.sub =  rs.subscribe(...);
}

将数据传递给next()方法是表示ReplaySubject(暂时)为空/出事件的最佳方式吗?

2 个答案:

答案 0 :(得分:2)

现在好了,我想你可以设置一个二级观察者来告诉你最后一个被重播的项目是什么:

const last$ = rs.replay(1);

然后你只需要组合最新并扫描......一旦你到达了最后一个$发出的项目,那么你的ReplaySubject就会完成重播:

this.sub = Observable.combineLatest(
  rs,
  last$.take(1)
).scan((acc: { item: Object, isReplay: boolean }, curr: [Object, Object]) => {
    return {item: curr[0], isReplay: acc.isReplay && curr[0] !== curr[1]};
  }, {isReplay: true}
).subscribe(...);

答案 1 :(得分:1)

因为主题也是观察者,您可以在最后complete()次来电后致电next()。然后你可以用subscribe(...)方法的第三个参数来听它。

const rs = new ReplaySubject<Object>();
rs.next({a: 1})
rs.complete()

rs.subscribe(
    obj => console.log(obj),
    error => {},
    () => console.log('completed')
);
// Outputs
// {a: 1} completed