Angular 订阅角2

Angular 订阅角2,angular,subscribe,Angular,Subscribe,我希望我的ngOnInit函数执行以下操作: -使用此.structureRequest.sendRequest()对某些数据发出http请求,该请求工作正常,在收到数据后,使用此.viewNodes()函数开始查看数据。 我使用subscribe,但它不起作用,我认为我对subscribe函数做了一些错误。请帮忙:) HomeComponent.ts import {Component} from '@angular/core'; import {Observable} from 'rxjs/

我希望我的ngOnInit函数执行以下操作: -使用此.structureRequest.sendRequest()对某些数据发出http请求,该请求工作正常,在收到数据后,使用此.viewNodes()函数开始查看数据。 我使用subscribe,但它不起作用,我认为我对subscribe函数做了一些错误。请帮忙:)

  • HomeComponent.ts

    import {Component} from '@angular/core';
    import {Observable} from 'rxjs/Observable';
    import {StructureRequestService} from './StructureRequestService';
    
    
    export class Content {
    
    
    ok: boolean;
    content = [];
    }
    @Component({
    providers: [StructureRequestService],
    styleUrls: ['app/home/home.css'],
    templateUrl:'./app/home/homePageTemplate.html'
    
    })
    
    export class HomeComponent {
    contentArray = [];
    myRes: Content;
    showAssigned:boolean = false;
    showSubitems:boolean = false;
    showUsers:boolean = false;
    
    constructor(private structureRequest: StructureRequestService) {}
    
    ngOnInit() {
    this.structureRequest.sendRequest().subscribe( this.viewNodes());
    
    }
    
    viewNodes() {
    this.myRes = this.structureRequest.result;
    this.contentArray = this.myRes.content;
    this.showAssigned = true;
     }
     }
    
  • 2.这是http服务,http get工作正常,接收到所有数据:

    import {Injectable} from '@angular/core';
    import {Http, Response, Headers, RequestOptions} from '@angular/http';
    
    import {Observable} from 'rxjs/Observable';
    
    @Injectable ()
    export class StructureRequestService {
    result: Object;
    //private myUrl = 'http://manny.herokuapp.com/audit/get/structure';
    private myUrl = './app/home/nodes.json';  // local URL to structure APi
    constructor (private http: Http) {
        //use XHR object
        let _build = (<any> http)._backend._browserXHR.build;
        (<any> http)._backend._browserXHR.build = () => {
            let _xhr =  _build();
            _xhr.withCredentials = true;
            return _xhr;
        };
    }
    
    sendRequest() {
        let body = JSON.stringify({});
        let headers = new Headers({ 'Content-Type': 'application/json'});
        let options = new RequestOptions({
            headers: headers
        });
         this.http.get(this.myUrl, options)
            .map((res: Response) => res.json())
            .subscribe(res => {this.result = res;
                return this.result; });
    }
    }
    
    从'@angular/core'导入{Injectable};
    从'@angular/Http'导入{Http,Response,Headers,RequestOptions};
    从“rxjs/Observable”导入{Observable};
    @可注射()
    导出类StructureRequestService{
    结果:对象;
    //私有myUrl=http://manny.herokuapp.com/audit/get/structure';
    private myUrl='./app/home/nodes.json';//构造APi的本地URL
    构造函数(专用http:http){
    //使用XHR对象
    让_build=(http)。_backend._browserXHR.build;
    (http)。_后端。_browserXHR.build=()=>{
    让_xhr=_build();
    _xhr.withCredentials=true;
    返回xhr;
    };
    }
    sendRequest(){
    让body=JSON.stringify({});
    let headers=新的头({'Content-Type':'application/json'});
    让选项=新的请求选项({
    标题:标题
    });
    this.http.get(this.myUrl,选项)
    .map((res:Response)=>res.json())
    .subscribe(res=>{this.result=res;
    返回this.result;});
    }
    }
    

    3.因此,问题在于采取同步步骤:接收数据,而不是查看数据

    当请求返回值时,您可能希望执行
    this.viewNodes
    ,而不是执行
    this.viewNodes()的结果

    这个

    应改为

    this.structureRequest.sendRequest().subscribe(() => this.viewNodes());
    
     return this.http.get(this.myUrl, options)
        .map((res: Response) => res.json())
        .map(res => {
          this.result = res;
          return this.result; 
        });
    
    前者执行this.viewNodes()
    并将结果传递给
    subscribe()
    ,后者创建一个新的内联函数,该函数传递给
    subscribe()
    。调用此内联函数时,将执行
    This.viewNodes()

    如果要传递值
    sendRequest()
    将返回

    this.structureRequest.sendRequest().subscribe((result) => this.viewNodes(result));
    
    更新

    sendrequest()
    不返回任何内容

    应该是

    return this.http.get(this.myUrl, options) ...
    
    但这只适用于您在代码中使用它的方式,如果它返回一个
    可观察的

    但是末尾的
    subscribe()
    返回一个
    subscribe

     return this.http.get(this.myUrl, options)
        .map((res: Response) => res.json())
        .subscribe(res => {this.result = res;
            return this.result; });
    
    因此,这应改为

    this.structureRequest.sendRequest().subscribe(() => this.viewNodes());
    
     return this.http.get(this.myUrl, options)
        .map((res: Response) => res.json())
        .map(res => {
          this.result = res;
          return this.result; 
        });
    


    区别在于
    do()
    不修改流的值,也不需要返回任何内容。将转发从
    .map()
    返回的值。如果要使用它,请确保导入了
    do
    (如
    map
    )。

    我已经尝试过这个.structureRequest.sendRequest().subscribe((结果)=>这个.viewNodes(结果));但是this.viewNodes无法启动super.works!谢谢你的解释。我已经标记了你的答案。和往常一样,冈特在堆栈溢出上的回复帮助了很多人做一些可能的重复