rxjs - 如何通过 catchError() 正确传播错误?

标签 rxjs angular-http rxjs6

我写了一个函数pipe -有能力的:

HandleHttpBasicError<T>()
{
    return ((source:Observable<T>) => {
        return source.pipe(
            catchError((err:any) => {
                let msg = '';
                if(err && err instanceof HttpErrorResponse)
                {
                    if(err.status == 0)
                        msg += "The server didn't respond";
                }
                throw {
                    err,
                    msg
                } as CustomError
            })
        )
        
    })
}
我可以在我的 HttpService 中以这种方式使用此功能:
checkExist(id:string)
{
    return this.http.head<void>(environment.apiUrl + 'some_url/' + id)
        .pipe(
            HandleHttpBasicError(),
            catchError((err:CustomError) => {
                if(err.msg)
                    throw err.msg;
                if(err.err.status == HttpStatusCodes.NOT_FOUND)
                    throw("It doesn't exist.");
                throw(err);
            })
            
        )
}
它工作得很好。当我订阅 checkExist() ,我收到一条很好的错误消息,因为 HandleHttpBasicError首先捕获一个错误并将其抛出到服务的 catchError() ,它会抛出错误消息,因为它不是 null .
这样,它允许我拥有一个全局 catchError()它处理始终相同的错误消息。以后我会在HttpHandler ,但这不是重点。
可以用 throw 链接错误吗?关键词?
我试图返回 Observable.throwError() ,但浏览器说

Observable.throwError is not a function


我的进口是 import {Observable, of, throwError} from 'rxjs'; .
这样做不是更好吗:
return ((source:Observable<T>) => {
        return source.pipe(
            catchError((err:any) => {
                msg = '';
                ...
                return of({err, msg} as CustomError)
                /* instead of
                throw(err)
                -or-
                return Observable.throwError(err) (which doesn't work)
                */
            })
        )
        
    })
?

最佳答案

Is it ok to chain the errors with the throw keyword ?



是的,完全没问题。 rxjs try catch 此类情况并将其转换为错误通知。

I tryed to return Observable.throwError() but the browser say "Observable.throwError is not a function"



使用 rxjs6,Observable不再修改原型(prototype)以包含运算符或这些“创建运算符”,而是将它们作为独立函数公开。您可以阅读更多信息 here ,但它的要点是您只需 return throwError(…) ,例如

return source$.pipe(
  catchError(err => err.code === 404 
    ? throwError("Not found")
    : throwError(err)
  )
)

关于rxjs - 如何通过 catchError() 正确传播错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50295564/

相关文章:

rxjs - 在 RxJS 中包装运算符,以便它可以应用于物化流

javascript - 正确使用变压器与拦截器

Rxjs - refCount 变为 0 后出现意外的 publishReplay + refCount 行为

angular - rxjs - 是否有一个always运算符?你总是怎么做某事?

javascript - 在 Angular 中单击时重置 rxjs 间隔

angular - observable 和 promise 在 rxjs 中兼容吗?

angular - 即使实际值相同,状态更改时组件也会重新渲染

angular - 将两个可观察数组连接在一起

angularjs - 如何在 Angular JS 中取消挂起的 API 调用

angularjs - 为什么 Angular $http 提供 headersGetter 而不仅仅是 headers?