【发布时间】:2018-12-10 07:23:17
【问题描述】:
最近我的一位同事在我们的 Angular 6 应用程序中的订阅中实现了一个回调,如下所示:
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 来解决这个“问题”会更好。但是在我实现/重构代码之后,它似乎并不是更好的解决方案。代码现在看起来要复杂得多。是否有必要将管道转换为 Promise 并将其作为可观察对象返回?
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 解决这个问题?还是我的同事有权使用简单的回调?
【问题讨论】:
-
在您的第一个示例中,无论请求是否成功,都会调用
callback。这是故意的吗?如果这是你的第二个例子没有多大意义。 -
不,这不是故意的。这是我同事实施中的一个错误。只有在请求成功时才应调用回调。我会在我的问题中解决它。