![](/img/trans.png)
[英]RxJS - How Subscriber is different from Observable and Subscription?
[英]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.