RxJS - 为什么要使用throwError而不是简单地抛出错误?

13
首先,我想明确表示我知道Rx的throwError操作符和JS的throw关键字之间的区别。 我只想知道为什么我要使用throwError操作符? 创建一个新的observable,所有它做的就是在任何人订阅它时抛出错误,我会得到什么好处?
简而言之,我为什么要这样做:
.catchError(err => throw "error!!")

在此之上:

.catchError(err => throwError("error!!"))
感谢!

3
在那种特定情况下使用throwError并没有任何好处,我更喜欢使用throw。你会在想要声明仅发出错误通知的Observable而不是命令式地抛出错误的情况下使用throwError(它是一个Observable创建者而不是操作符)。 - cartant
3个回答

4

如果直接抛出错误,它会结束管道。如果使用throwError,它将返回一个新的可观察对象,该对象将发射该错误,并将其传递给下游管道。 throwError(error)等效于这个操作:

return new Observable(observer=>{
      observer.error(error)
    })

0
在这种情况下,语法是唯一的区别。没有理由使用throw而不是throwError或者反过来。与您的团队选择一种方法并坚持下去。 证明
// Error using reactive throwError
// logs error 'oops!!'
of(1)
    .pipe(
        switchMap(
           (x) => throwError('oops!!'))
        )
    .subscribe({
        next: console.log,  // not called
        error: console.error, 
        complete: () => console.log('complete!'),  // not called
    }); 

// Error using imperative throw
// logs error 'oops!!'
of(1)
    .pipe(
        switchMap((x) => {
            throw 'oops!!';
        })
    )
    .subscribe({
        next: console.log,  // not called
        error: console.error,
        complete: () => console.log('complete!'), // not called
    }); 

两种方式的输出结果相同。请注意,根据Observable contract,在这两种情况下都不会调用完成处理程序。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接