如何使用可选订阅优化编码异步操作?

时间:2018-01-25 15:14:59

标签: typescript rxjs observable

我有一个看起来像这样的代码(不完全,但足够接近):

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魔法可以完成上述所有操作,但更短,更简单?

0 个答案:

没有答案