【问题标题】:rxjs - handling async errors in finallyrxjs - 在 finally 中处理异步错误
【发布时间】:2018-06-28 08:02:49
【问题描述】:

我有兴趣在取消订阅 observable 时调用异步函数,但是,一旦取消订阅,我就无法以同步方式处理错误,例如我有以下代码,错误是没抓到。

const observable = Observable.of(true).finally( async () => {
            throw new Error('what');
        });

        try {
            observable.subscribe().unsubscribe();
        } catch (e) {
            console.log('We did not capture this');
        }

finally 中处理异步错误的可能方法是什么?

【问题讨论】:

  • 从 RxJS 版本 6 开始,subscribe 调用永远不会抛出错误(除非明确启用了 deprecated, synchronous error handling),因此 try/catch 将无效。此外,finally 将简单地忽略您的函数返回的承诺。它不期望一个,它也毫无意义。这样想:当调用finally的回调时,订阅结束;不会有订阅者收到您的错误(通过承诺拒绝)。

标签: error-handling promise rxjs


【解决方案1】:

我认为有两个问题:

  1. 调用unsubscribe() 不会做任何事情,因为of(true) 会在订阅时立即发送nextcomplete 通知。因此,当您自己致电unsubscribe() 时,您已经因为complete 通知而取消订阅。那么在这种情况下,实际调用 unsubscribe() 将不会执行任何操作。

  2. 当您将方法标记为async 时,这意味着您实际上返回了一个被拒绝的 Promise。但是.finally 期望它调用一个函数,并且对它的返回值不做任何事情。当您将其标记为 async 时,它会返回一个 Promise 但没有人听它。

【讨论】:

    【解决方案2】:

    如果你想捕捉错误,你必须删除 async 关键字,

    const observable = Observable.of(true).finally(() => {
                throw new Error('what');
            });
    

    使用 async 它将把它变成一个异步函数并且不会被捕获。你现在做的类似于

        try {        
            setTimeout(()=> {throw new Error('what');},10)
        } catch (e) {
            console.log('We did not capture this');
        }
    

    Throw 将在事件循环而不是主线程中执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2016-03-30
      相关资源
      最近更新 更多