Parsing 是否可以在Angular2(Typescript)中创建一个解析器类来处理响应?

Parsing 是否可以在Angular2(Typescript)中创建一个解析器类来处理响应?,parsing,angular,angular2-services,Parsing,Angular,Angular2 Services,我知道我可以在Angular 2(Typescript)中创建一个组件和一个服务,并可以在组件中解析响应,但我希望我的体系结构如下所示,对于响应中的任何更改,我只需更改我的解析器: 服务:执行API调用并获取响应。有一个get响应方法 解析器:获取响应并解析响应,然后以可用形式将响应返回给组件 组件:从解析器获取响应并显示要查看的数据 为了做到这一点,我使用了一个来自服务的observable,并在解析器中订阅它。然后使用来自解析器的可观察对象,并在组件中订阅它 但是在这样做的过程中会出现很多错

我知道我可以在Angular 2(Typescript)中创建一个组件和一个服务,并可以在组件中解析响应,但我希望我的体系结构如下所示,对于响应中的任何更改,我只需更改我的解析器:

服务:执行API调用并获取响应。有一个get响应方法

解析器:获取响应并解析响应,然后以可用形式将响应返回给组件

组件:从解析器获取响应并显示要查看的数据

为了做到这一点,我使用了一个来自服务的observable,并在解析器中订阅它。然后使用来自解析器的可观察对象,并在组件中订阅它

但是在这样做的过程中会出现很多错误。我是否遗漏了任何步骤,或者这是解决问题的正确方法

添加代码:

组件:::

    import { AuthenticateParser } from './../../parsers/authenticate.parser';
    import { Component, OnInit } from '@angular/core';
    @Component({
     selector: 'my-component',
     moduleId: module.id,
     templateUrl: './app.component.html',
     providers : [AuthenticateParser]
    })
    export class AppComponent implements OnInit {
     // Constructor Function
     constructor(private _authenticationService: AuthenticateParser) {
     }
     ngOnInit(): void {
      this._authenticationService.setAuthenticationToken();
     }
    }
服务:::

import { Observable } from 'rxjs/Observable';
import { IRequest } from './api.interaction.interface';
import { Http, Headers, RequestOptions, Response } from '@angular/http';
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';

@Injectable()
export class ApiInteractionService {
 // Constructor Function
 constructor(private _http: Http) {
 }
 getApiResponse(p_attr: IRequest): Observable<Response> {
    // Set request url
    let _authenticationUrl: string = p_attr.url;
    // Set request body
    let _body: any = p_attr.body;
    // Set content type to JSON
    let _headers = new Headers(p_attr.header);
    // Set a request option
    let _options = new RequestOptions({ headers: _headers });

    return this._http[p_attr.method](_authenticationUrl, _body, _options)
        .map((response: Response) => response.json()) ///... change response to JSON format
        .do((data:any) => console.log('All : ' + JSON.stringify(data))) //... console response
        .catch((error: any) => Observable.throw(error.json().error || 'Server error')); //...errors if any
}}

听起来您想将解析器作为服务。如果您给出示例代码,可能会有所帮助

在解析器中,您可以订阅http.get响应,然后解析响应,然后将结果发布到主题。然后在组件中从解析器订阅主题

您的解析器类似于:

import { Injectable, OnInit} from '@angular/core';
import { Subject } from 'rxjs/Subject';
import {YourService} from '....''

@Injectable()
export class ParseService implements OnInit {
  public parseSubject: Subject<any> = new Subject <any>();
  constructor(private service: YourService) {}
  ngOnInit(){
   this.service.yourGetFunction()
      .map(res=> res.json())
      .subscribe(
           response => { 
                 parse logic that stores result in parsedObj
                 parseSubject.next(parsedObj);
            },
            error => { this.errorMessage = <any>error});
   }
}
从'@angular/core'导入{Injectable,OnInit};
从'rxjs/Subject'导入{Subject};
从“..”导入{YourService}
@可注射()
导出类ParseService实现OnInit{
公共主题:主题=新主题();
构造函数(私有服务:YourService){}
恩戈尼尼特(){
this.service.yourGetFunction()
.map(res=>res.json())
.订阅(
响应=>{
将结果存储在parsedObj中的解析逻辑
parseSubject.next(parsedObj);
},
error=>{this.errorMessage=error});
}
}

现在,在您的组件中,您可以导入
ParseService
并订阅其parseSubject以获得解析的输出

?!您的服务是您导入已实现API调用的服务的地方。这是一个指导代码,yourGetFunction()也是如此,您将其替换为api服务中的get函数得到问题:),未能添加ApiInteractionService。
import { Injectable, OnInit} from '@angular/core';
import { Subject } from 'rxjs/Subject';
import {YourService} from '....''

@Injectable()
export class ParseService implements OnInit {
  public parseSubject: Subject<any> = new Subject <any>();
  constructor(private service: YourService) {}
  ngOnInit(){
   this.service.yourGetFunction()
      .map(res=> res.json())
      .subscribe(
           response => { 
                 parse logic that stores result in parsedObj
                 parseSubject.next(parsedObj);
            },
            error => { this.errorMessage = <any>error});
   }
}