在rxjs Observable中抛出错误

时间:2017-02-15 11:04:26

标签: javascript error-handling rxjs reactive-programming

我试图在rxjs Observable中抛出错误

 new Observable(subscriber => {
   Observable.throw("error1");
   return Observable.throw("error2");
 })
 .subscribe(
   () => {},
   err => console.error(err)
 );

错误1未被捕获。

error2给出了编译错误:

Argument of type '(this: Observable<{}>, subscriber: Subscriber<{}>) => ErrorObservable<string>' is not assignable to parameter of type '(this: Observable<{}>, subscriber: Subscriber<{}>) => TeardownLogic'. Type 'ErrorObservable<string>' is not assignable to type 'TeardownLogic'

在observable中抛出错误的正确方法是什么?

4 个答案:

答案 0 :(得分:14)

使用Subscriber.error

&#13;
&#13;
new Rx.Observable(subscriber => {
  subscriber.error("error1");
  subscriber.error("error2"); // not called because a stream will be finalized after any error
})
.subscribe(
  () => {},
  err => console.error(err)
);
&#13;
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:4)

使用Observable.create()Observable.create(subscriber => { subscriber.error(new Error("error1")); }) .subscribe( () => {}, err => console.log(err.message) ); 时,您可以将错误直接推送到订阅者(观察者):

new Observable()

传递给Observable.throw("error1")的匿名函数可以选择返回取消订阅回调。这就是为什么它会给你错误,因为你正在返回一个Observable。

通常不需要使用Observable.create(subscriber => { subscriber.next('whatever'); }) .merge(Observable.throw(new Error("error2"))) .subscribe( () => {}, err => console.log(err.message) ); 。这只是一个仅发出错误的Observable,仅此而已。您可以使用它,例如:

double

查看现场演示:https://jsbin.com/fivudu/edit?js,console

答案 2 :(得分:1)

使用您自己创建的可观察对象,您可以访问observer.error()方法。

const obs = Observable.create(observer => {

  // Emit a value.
  observer.next("hello");

  // Throw an error.
  observer.error("my error");

});

注意:如果您使用的是RxJS 4,则必须使用onNext()onError()

答案 3 :(得分:1)

在v6及更高版本中,您要导入throwError,该Observable.throw静态方法是v5 compat遗留下的不幸。

import { throwError } from 'rxjs';
throwError('hello');

来源:https://github.com/ReactiveX/rxjs/issues/3733#issuecomment-391427430