我有一个看起来像这样的代码(不完全,但足够接近):
class Form<R> {
restClient: {
getById(id: number): Observable<R>;
};
createEmptyRecord(): R {
return {};
}
load(id: number | null): Observable<R> {
let loader: Observable<R>;
if (id !== null) {
loader = this.restClient.getById(id);
} else {
loader = Observable.of(this.createEmptyRecord());
}
const result = loader
.do(record => {
// some side effect
})
.publishReplay(1);
result.connect();
return result;
}
}
因此,load()
应该将现有或空记录检索到表单中,并且它还应该允许在加载完成时获得通知,但这是可选的,如果没有人订阅,它仍然应该完成加载。此外,如果通知observable多次订阅,则不应启动另一个加载过程。例如。所有这些都应该有效:
const form = new Form<Customer>();
// Load empty record, not interested in notification:
form.load(null);
// Load empty record, need notification:
form.load(null).subscribe(console.log);
// Load existing record, not interested in notification:
form.load(1);
// Load existing record, need notification:
form.load(1).subscribe(console.log);
// Load existing record, need several notifications,
// but only one real REST call:
const s = form.load(2);
s.subscribe(console.log);
s.subscribe(console.log);
上面的代码实际上有效(我希望它能正常工作),但感觉非常尴尬。
问题是:它能以更好的方式编写吗?也许有一些RxJS魔法可以完成上述所有操作,但更短,更简单?