Функция внутри подписки - Angular 4 - PullRequest
0 голосов
/ 13 июня 2018

У меня проблема с вызовом функции в рамках подписки.В этой функции я вызываю подписку, которая обновляет токен, если она возвращает «true», я затем вызываю ту же функцию, но эта операция не работает.

Основная функция:

 getLicenseList():Observable<License[]>{
    let licenseList:License[] =[];
    return this._http.get("license/list").map(res => {
        let processedData = res;
        if(processedData['status'] == "401"){
            this._http.refreshToken().subscribe(result => {
                this.getLicenseList();
            });
        }else{
            for(let license of processedData['data']){
                const obj = new License(license['name'],license['start_date'],license['expire_date'], license['type'], license['duration'],license['id'],license['id_user'], license['projectsList']);
                licenseList.push(obj);
            }
            return licenseList;
        }
    });

}

Функция для обновления токена:

refreshToken():Observable<boolean>{
    let url = 'auth/refresh/self';
    return this.post(url, localStorage.getItem('refresh_token')).map(data => {
        if(data['access_token'] != null || data['refresh_token'] != null){
            window.localStorage.setItem('access_token', data['access_token']);
            window.localStorage.setItem('refresh_token', data['refresh_token']);
            return true;
        }
    }).catch(error =>Observable.throw("Expired refresh token"));
}

в режиме отладки в Res можно увидеть: «Неожиданный конец ввода»

Ответы [ 2 ]

0 голосов
/ 13 июня 2018
getLicenseList():Observable<License[]>{
    let licenseList:License[] =[];
    return this._http.get("license/list").map(async res =>{
            let processedData = res;
            if(processedData['status'] == "401"){
                this._http.refreshToken().subscribe(result =>{ if(result){ return this.getLicenseList();} });
            else{
            for(let license of processedData['data']){
                const obj = new License(license['name'],license['start_date'],license['expire_date'], license['type'], license['duration'],license['id'],license['id_user'], license['projectsList']);
                licenseList.push(obj);
            }
            return licenseList;
        }
    });

}

Я вижу, вы передаете кучу переменных конструктору.Я рекомендую передать весь объект и попросить конструктор позаботиться о разборе.Используйте async и ждите внутри наблюдаемого, чтобы заставить вещи ждать.Кроме этого отличного кода!

0 голосов
/ 13 июня 2018

Вы можете использовать flapMap для объединения наблюдаемых

 return http.get(req1)
      .flatMap(resp => {
        // whatever you need
        return this.http.post(req2);
      })
...