在取消订阅功能中异步处理资源

时间:2018-09-17 12:43:35

标签: javascript rxjs rxjs6

我想在可观察对象的unsubscribe函数中异步处理资源。例如:

// rxjs 6
let observable = Observable.create(sub => {
    let resource = new Resource();
    return {
        async unsubscribe() {
            await resource.dispose();
        }
    }

};

问题在于,由于不应将unsubscribe函数返回一个Promise,因此没有任何等待的结果,因此unsubscribe函数将在资源之前“过早”已完全处置。这可能会导致在处置资源时不应该发生的行为。

我该如何处理?

1 个答案:

答案 0 :(得分:0)

没有任何提示in the RxJS source code可以将Subscription.unsubscribe的结果用于等待异步代码执行。

我们看到unsubscribe可能会返回将被处理的errorObject,但是unsubscribe函数不会将其返回给消费者本身,因此没有机会等待它。 / p>

它似乎也可以通过设计来实现。 Observable contract指出:

  

当观察者向观察者发出取消订阅通知时,观察者将尝试停止向观察者发出通知。但是,不能保证Observable在观察者发出取消订阅通知后不会向观察者发出任何通知。

这表明unsubscribe通知不应以任何方式保证Observable的完整性。

或者,complete通知似乎正是我们想要的。从语义上讲,它似乎符合要求,因为它表明Observable已达到其最终生命周期状态。

编辑

尝试了我以前的方法后,我注意到在使用complete之后,unsubscribe通知将不会到达订阅者,因此这也不是一种选择。我认为目前尚无解决方案。