簡體   English   中英

RxJS-如何用可觀察對象替換訂閱中的回調

[英]RxJS - How to replace a Callback in a Subscription with an Observable

最近,我的一位同事在Angular 6應用程序的Subscription中實現了回調,如下所示:

callDoSomething() {
  this.doSomething(() => { 
    // logic from callback
   });
}

public doSomething(callback: any) {
  this.http.get('/api/doSomething').subscribe(data => {
    // do something with data
    if (callback) {
      callback();
    }
  }, error => {
    // do something with error
  });
}

我認為最好用RxJS Observable解決此“問題”。 但是在實現/重構代碼后,它似乎並不是更好的解決方案。 該代碼現在看起來更加復雜。 是否有必要將管道投放到承諾中並以可觀察的方式返回?

import { Observable, of as observableOf, from as observableFrom } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

callDoSomething() {
    this.doSomething().subscribe((result) => {
    if (result) {
        // logic from callback
    }
    });
}

public doSomething() {
    let promise = this.http.get('/api/doSomething').pipe(
    map(data => {
        // do something with data
        return observableOf(true);
    }),
    catchError((error) => {
        // do something with error
        return observableOf(false);
    })
    ).toPromise()

    return observableFrom(promise);
}

使用Observables是否有更好的方法解決此問題? 還是我的同事有權使用簡單的回調?

您無需強制轉換為Promise ,然后再次強制轉換為Observable 還要看map功能。 為什么你從中返回true map功能旨在更改即將到來的數據,然后再傳遞已更改的數據。

public doSomething() {
    let observable= this.http.get('/api/doSomething').pipe(
    map(data => {
        // do something with data
        return observableOf(true);
    }),
    catchError((error) => {
        // do something with error
        return observableOf(false);
    }));

    return observable;
}

恕我直言,回調是最簡單的解決方案。 完整的處理程序可能是一個更好的地方。 如果您想使用可觀察變量,那么我將堅持使用流語義。

如果您的目標是處理成功案例,並且不想從函數中獲取數據,則可以返回一個空的,完整的可觀察值。 如果發生錯誤,您可以讓它通過,也可以將其替換為以錯誤結尾的空的可觀察對象。 它類似於observable.of(true / false) ,但是依賴於流語義而不是任意值。

    doSomething() {
     return this.http.get('/api/doSomething').pipe(
        flatMap(data => {
          // do something with data
          return empty();
        }),
        catchError((error) => {
          // do something with error
          return throwError(error); //instead of error pass whatever you like
        })
      );
    }

    callDoSomething() {
      this.doSomething()
       .subscribe(
         undefined, //we don't handle data
         undefined, //we don't handle errors
         () => {// logic from callback}
       );
    }

如您所見,與回調解決方案相比,它的代碼仍然更多。 但是,如果有一天添加了錯誤回調,這可能是一個有趣的選擇。 可觀察到的解決方案的好處是:沒有。

暫無
暫無

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

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