【问题标题】:Angular2 how to create Promise that's executing Observable inside?Angular2如何创建在内部执行Observable的Promise?
【发布时间】:2018-10-18 05:27:43
【问题描述】:

我认为这不是很复杂的问题,但我有点困惑如何使用 Promise 来解决这个问题。

有 3 个重要的实例:

  • 组件
  • HtppService
  • 工具服务

结构如下: 组件有ToolService来执行函数——例如函数create()。 ToolService 有 HttpService,方法 create() 是这样的:

public create(){

  this.httpService.create().subscribe(

    (data) => {
      //some complex processing
    },
    (error) => {
      //handling error
    }
  );

}

您可以猜到httpService.create() 返回http.put()

问题是我想通知Component create() 的结果。所以我的想法是create()应该返回一个Promise,当(data)时会实现,当(error)时会被拒绝。

我有点困惑如何做到这一点。也许我应该以其他方式做到这一点? 请提出一些建议。

【问题讨论】:

  • 订阅监听器应该只在组件中。直接从Component调用httpService.create(),而不是从ToolService调用。
  • @Srigar 我不想那样做。我想在 ToolService 中处理响应,而不是在组件中
  • 将函数引用作为参数从组件传递给 ToolsService 并订阅它。它会工作
  • 这不是我要找的

标签: angular promise angular2-services angular-promise


【解决方案1】:

在您的服务内import {Http, Response} from '@angular/http'; import { Observable } from 'rxjs/Observable';

在您的服务构造函数中创建 Http constructor(private http:Http){} 的实例

public create(parameterToBeSend : any){
  return 
  this.http.put(`http://enter_your_service_url_here`,parameterToBeSend)
  .map( (response: Response) => {
      const data = response.json();
      return data;
   })
  .catch( (error: Response) => {
      return Observable.throw('Something went wrong');  
   }) 
  }

.map 将创建另一个可观察对象,在将数据发送到您的组件之前,您可以在这里简单地处理它。 .catch 如果您想发送任何自定义错误,那么这将很有用,但请确保它不返回 Observable,因此您需要像我一样显式转换它。 最后在您的组件中使用以下

public create(){
this.httpService.create().subscribe(
 (data) => {//complex process},
 (error) => {//handling error}
);
}

【讨论】:

  • 你想创建自定义的 Observable 还是 Promise?
  • 对我来说没什么区别,我只想把复杂的处理提取出来服务
【解决方案2】:

您的“工具服务”应如下所示

create(): Observable<any> {
   return this.httpService.create().map((response) => {
      return response;
   });
 }

而“组件”应该是这样的

this.toolService.create().subscribe((response) => {
   // Do what ever you want here
});

希望对您有所帮助!

【讨论】:

  • 我知道这可行,但我正在寻找别的东西。我真的很想像你一样在 create() 中返回一个 observable 或 promise,但我想在 subscribe 中创建它,而不仅仅是映射响应并进一步传递
  • 你不能从 subscribe 返回一个 observable 但如果你使用 map 而不是 subscribe 则返回一个 Observable。
猜你喜欢
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2016-08-01
  • 2017-03-15
相关资源
最近更新 更多