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

时间:2018-11-24 16:30:03

标签: javascript rxjs

首先,我想明确地说,我知道Rx throwError运算符和JS的throw关键字之间的区别。我只是想知道为什么要使用throwError运算符?通过创建一个新的可观察对象,我所做的就是在第二个人订阅该错误时抛出错误?

长话短说,为什么我要这样做:

.catchError(err => throw "error!!")

对此:

.catchError(err => return thorwError("error!!"))

谢谢!

2 个答案:

答案 0 :(得分: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,在两种情况下都不会调用完成处理程序。

答案 1 :(得分:0)

在管道运算符中使用 throwError 可能有问题,因为 throwError observable 可能会根据后续操作在管道中传递。有关详细信息,请参阅本文:https://medium.com/angular-in-depth/throwerror-is-not-throw-error-ad6c76c53377