【发布时间】:2017-09-05 20:52:04
【问题描述】:
我正在尝试创建 2 个 observables,它们基本上执行逆运算。它是一个服务发现端点,因此在启动应用程序时,它必须尝试注册到服务发现,直到成功。所以我想创建一个像这样的 observable:
const create$ = Rx.Observable.create((observer) => {
observer.next('Trying to create observation');
sp.put(endpoint, { json: true }, (err, res, payload) => {
err ? observer.error(err) : observer.complete();
});
});
当应用程序进行正常关闭时,我想做反向操作。像这样:
const delete$ = Rx.Observable.create((observer) => {
console.log('deleted subscribed');
observer.next('Trying to delete observation');
sp.delete(endpoint, { json: true }, (err, res, payload) => {
err ? observer.error(err) : observer.complete();
});
});
所以我决定创建一个函数,它返回一个具有.create() 和.delete() 的对象。我要解决的问题是,当应用程序启动并尝试注册,但无法到达服务发现端点并且稍后应用程序启动它的正常关闭过程并调用.delete() 操作时,.create() 操作不应该再跑吧。
function observe({ url, version, serviceName }) {
const endpoint = `/endpoint/${serviceName}/${version}/${encodeURIComponent(url)}`;
const create$ = Rx.Observable.create((observer) => {
observer.next('Trying to create observation');
sp.put(endpoint, { json: true }, (err, res, payload) => {
err ? observer.error(err) : observer.complete();
});
});
const delete$ = Rx.Observable.create((observer) => {
console.log('deleted subscribed');
observer.next('Trying to delete observation');
sp.delete(endpoint, { json: true }, (err, res, payload) => {
err ? observer.error(err) : observer.complete();
});
});
return {
create() {
return create$.retry(Number.POSITIVE_INFINITY).takeUntil(delete$); // This is where I would want to takeUntil()
},
delete({ interval = 5000, times = 0 } = {}) {
return delete$.retry(times);
},
}
}
我遇到的问题是,当使用.takeUntil() 时,它订阅了delete$,它开始执行删除操作,其效果是立即停止create$ observable。
我尝试做takeUntil(Observable.merge(Observable.never(), delete$)),但它订阅了两者,所以不起作用。我也尝试过takeUntil(Observable.concat(Observable.never(), delete$)) 第一个永远不会结束(:P),第二个永远不会订阅。
【问题讨论】:
-
您的重试逻辑是否正确?描述听起来像是“创建”是重试的那个?
-
@jayphelps 我更新了创建时的重试逻辑。我想在创建时无限重复,但如果删除开始尝试就停止
标签: rxjs observable observer-pattern rxjs5