【问题标题】:Dispose of a resource asynchronously in the unsubscribe function在 unsubscribe 函数中异步处理资源
【发布时间】:2019-02-21 09:32:14
【问题描述】:

我想在 observable 的 unsubscribe 函数中异步处理资源。例如:

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

};

问题在于,因为unsubscribe 函数不应该返回Promise,所以不会等待它,所以unsubscribe 函数将在资源被完全处置之前“过早”。这可能会导致在处理资源时不应发生的行为。

我该如何处理?

【问题讨论】:

  • 哪些行为可能发生而“不应该发生”?一旦您unsubscribe 订阅,您就无法再对该订阅进行任何操作。那么您可能会让create 返回的“拆卸功能”花时间处理资源。如果我误解了你的意思,请道歉。
  • @Picci 订阅结束后,创建新资源或销毁依赖资源(使用 rxjs 运算符)的逻辑可以在现有资源仍在处理时执行。稍后我会添加一个代码示例。
  • 无法收到取消订阅拆卸中的异步操作已完成的确认。这意味着在创建资源时需要执行任何等待。您应该创建一个知道您的 can-create-while-disposing 约束的工厂。在任何情况下,即使可以通知拆卸中的异步操作已完成,调用者仍然可能违反您的多次订阅约束。所以我认为最好使用防止创建多个资源等的工厂来表示这一点。
  • GitHub查看随后的讨论/功能建议。

标签: javascript rxjs rxjs6


【解决方案1】:

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

我们看到unsubscribe 可能会返回一个errorObject,该errorObject 将被咳嗽和处理,但它不会由取消订阅函数返回给消费者本身,因此没有机会等待。

它似乎也是通过设计以这种方式实现的。 Observable contract 声明:

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

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

另外,complete 通知似乎是我们正在寻找的。从语义上看,它似乎符合要求,因为它表明 Observable 已达到其最终生命周期状态。

编辑

在尝试了我以前的方法后,我注意到在使用unsubscribe 后,complete 通知不会到达订阅者,所以这也不是一个选项。我认为目前没有解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2018-12-12
    • 1970-01-01
    • 2012-07-23
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多