在rxjs Observable中抛出错误

phz*_*nta 15 javascript error-handling reactive-programming rxjs

我试图在rxjs Observable中抛出一个错误

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

错误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'
Run Code Online (Sandbox Code Playgroud)

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

ols*_*lsn 14

用途Subscriber.error:

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)
);
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


mar*_*tin 5

使用new Observable()或时,Observable.create()您可以将错误直接推送给订阅者(观察者):

Observable.create(subscriber => {
   subscriber.error(new Error("error1"));
 })
 .subscribe(
   () => {},
   err => console.log(err.message)
 );
Run Code Online (Sandbox Code Playgroud)

传递给的匿名函数new Observable()可以选择返回一个退订回调。这就是为什么它会给您错误的原因,因为您要返回一个Observable。

使用Observable.throw("error1")通常是没有必要的。这只是一个Observable,仅发出错误,仅此而已。您可以像下面这样使用它:

Observable.create(subscriber => {
    subscriber.next('whatever');
  })
  .merge(Observable.throw(new Error("error2")))
  .subscribe(
    () => {},
    err => console.log(err.message)
  );
Run Code Online (Sandbox Code Playgroud)

观看现场演示:https//jsbin.com/fivudu/edit?js,控制台


Eug*_*hov 5

在 v6 及更高版本中,您想要 import throwError, Observable.throw 静态方法是 v5 兼容遗留下来的不幸的必需品。

import { throwError } from 'rxjs';
throwError('hello');
Run Code Online (Sandbox Code Playgroud)

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