簡體   English   中英

在 rxjs Observable 中拋出錯誤

[英]throw error inside rxjs Observable

我正在嘗試在 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 中拋出錯誤的正確方法是什么?

使用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) );
 <script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

使用new Observable()Observable.create()您可以將錯誤直接推送給訂閱者(觀察者):

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

傳遞給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)
  );

看現場演示: https : //jsbin.com/fivudu/edit?js,console

在 v6 及更高版本中,您想要導入throwError ,該 Observable.throw 靜態方法是 v5 兼容遺留下來的不幸必需品。

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

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

使用您自己創建的 observable,您可以訪問observer.error()方法。

const obs = Observable.create(observer => {

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

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

});

注意:如果您使用的是 RxJS 4,則必須改用onNext()onError()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM