如何在Angular中链接服务方法?

时间:2017-08-24 08:22:29

标签: javascript angular callback rxjs

我需要将两个服务链接在一起才能成功发出HTTP请求。第一个服务创建一个Authorization Header,第二个服务调用Angular Http服务。

如何链接这些调用,以便Authorify Header服务在进行主HTTP调用之前返回?

当我运行此代码时,出现.toPromise() of undefined

错误
get(url) {
    const headers = new Headers();
    this.createAuthorizationHeader(headers,function(){
       return this.http.get(url, {headers: headers});
});

}

授权标题服务:

import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import { environment } from '../../environments/environment';
import { ErrorHandlerService } from './error-handler.service';
import { tokenNotExpired, JwtHelper } from 'angular2-jwt';
@Injectable()
export class HttpClient {
jwtHelper: JwtHelper = new JwtHelper();
count = 1;
constructor(private http: Http, private _errorHandler: ErrorHandlerService) 
{ }
createAuthorizationHeader(headers: Headers) {
    let token = '';
    if (sessionStorage.getItem('token')) {
        token = sessionStorage.getItem('token')
    }
    if (token && typeof token === 'string') {
        if (this.jwtHelper.isTokenExpired(token) && this.count === 1) {
            this.refreshToken()
        }
        else {
            headers.append('Authorization', 'Bearer ' + token);
        }
    }
}

get(url) {
    const headers = new Headers();
    this.createAuthorizationHeader(headers);
    return this.http.get(url, {
        headers: headers
    });
}
 refreshToken(): any {
    this.getRefreshAWSToken(sessionStorage.getItem('refresh_token'))
        .then(resp => {
            return this.getwithheader(environment.BASE_URL + '/token', JSON.parse(resp).id_token).toPromise()
                .then((resp1: Response) => {
                    console.log(resp1)
                    const newJwttoken = JSON.parse(resp1.text()).token;
                    sessionStorage.setItem('token', newJwttoken);
                    const headers = new Headers();
                    headers.append('Authorization', 'Bearer ' + newJwttoken);
                })
                .catch(err => this._errorHandler.handleError(err));
        });
}
}

Http请求服务:

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/toPromise';
import { DataTableParams } from 'angular-4-data-table';
import { SharedService } from './shared.service';
import { HttpClient } from './http.service';
import { Observable } from 'rxjs/rx';
import { ErrorHandlerService } from './error-handler.service';
@Injectable()
export class DeviceService {
BASE_URL: String;
constructor(private http: HttpClient,
    private _sharedService: SharedService,
    private _errorHandler: ErrorHandlerService) {
    this.BASE_URL = this._sharedService.BASE_URL;
};


getCarriers(): any {
    return this.http.get(this.BASE_URL + '/lookup/carriers').toPromise()
        .then((resp: Response) => resp.text())
        .catch(err => this._errorHandler.handleError(err));
}
}

0 个答案:

没有答案
相关问题