【发布时间】:2018-09-01 20:16:09
【问题描述】:
我有一个 Angular 5 应用程序,我必须在其中调用一些繁重的 REST 服务(通常需要几秒钟)。我需要它的结果在应用程序的不同部分,所以我想将结果存储在 DataStorageService 中。 基本上,这是我想要实现的:
@Injectable()
export class DataStorageService {
private result: MyCustomObject;
constructor(private service: Service) {}
getResult(): MyCustomObject {
if (typeof this.result === 'undefined') {
// save result
}
return result;
}
问题是我如何才能等到 HTTP 请求完成,然后保存并返回“结果”对象。我也尝试使用 Promise 和 Observable 来解决它,但它们都不能正常工作。
-
可观察:
if (typeof this.result === 'undefined') { this.service.call() .subscribe(response => this.result = response); } return this.result; // wait for save and return MyCustomObject -
承诺:
if (typeof this.result === 'undefined') { this.service.call() .toPromise() .then(response => this.result = response); } return this.result; // wait for save and return MyCustomObject
【问题讨论】:
-
你的
getResult(): Promise<MyCustomObject>也应该返回一个promise/observable。午饭回来时,将编码丢失的代码。与此同时,查看github.com/ngrx/store 可能会为该问题带来新的解决方案。 -
我想避免返回 Promise 或 Observable。我需要根据打开的页面将结果聚合到不同的对象中。如果我总是必须订阅 Promise,这会使我的代码变得如此丑陋。而不是使用简单的对象。
-
代码清晰和维护注意事项:你的方法命名为
getResult(),但它实际上保存了结果,所以行为与名称不匹配,导致混淆 -
你说得对,大卫。为了更好地理解,我从头开始编写它。也许值得将保存功能移动到 ngOnInit 方法中。
-
我更新了我的问题,因为原来的问题在不必要的代码中过于含糊。很抱歉。
标签: angular http promise observable