当我取消订阅可观察对象时,我有兴趣调用异步函数,但是,一旦取消订阅,我将无法以同步方式处理错误,例如,我有以下代码,并且错误是没抓住。
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
中处理异步错误的可能方法是什么?
答案 0 :(得分:1)
我认为有两个问题:
调用greetings.res.lang
不会执行任何操作,因为unsubscribe()
会在订阅后立即发送of(true)
和next
通知。因此,当您自己致电complete
时,由于unsubscribe()
的通知,您已经被取消订阅。然后,在这种情况下,实际的呼叫complete
将无济于事。
将方法标记为unsubscribe()
时,这实际上意味着您返回的Promise被拒绝。但是async
期望它会调用一个函数,并且对其返回值不执行任何操作。当您将其标记为.finally
时,它会返回一个Promise,但没有人听。
答案 1 :(得分:0)
如果您想捕获错误,则必须删除async关键字
const observable = Observable.of(true).finally(() => {
throw new Error('what');
});
具有异步功能,它将把它变成一个异步功能,不会被捕获。您现在正在做什么类似于
try {
setTimeout(()=> {throw new Error('what');},10)
} catch (e) {
console.log('We did not capture this');
}
在事件循环中而不是在主线程中抛出异常。