Угловое 7 наблюдаемое ожидание переменной, чтобы быть ложным - PullRequest
0 голосов
/ 19 декабря 2018

Следующее наблюдаемое:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { CookieService } from 'ngx-cookie-service';
import { Observable } from 'rxjs';

@Injectable()
export class AuthService {
    readonly loginUrl = <login_url>;
    readonly authStatusUrl = <auth_status_url>;
constructor(private http: HttpClient, private cookieService: CookieService) {}

loggingIn = false;

login(username: string, password: string) {
    this.loggingIn = true;
    const creds = {
        username: username,
        password: password
    };
    this.http
    .post<any>(this.loginUrl, creds, {})
    .subscribe(
        data => this.onLoginSuccess(data),
        error => this.onLoginFail(error));
}

handleAuth(): Observable<any> {

    const token = this.cookieService.get('token');
    const refresh = this.cookieService.get('refresh');

    // should wait for loggingIn to be false
    return this.http
        .post<any>(this.authStatusUrl, { }, {
            headers: {
                token: token,
                refresh: refresh
            }
        });
}

public onLoginSuccess(data) {
    this.loggingIn = false;
    this.cookieService.set('token', data.access_token);
    this.cookieService.set('refresh', data.refresh_token);
}

onLoginFail(err) {
    console.log('Faild to login');
    this.loggingIn = false;
}

}

не должно выполняться, пока локальная переменная не станет ложной.

Я прочитал, что это должно быть сделано с помощью Promises иВызов функции async с оператором await, но я не смог найти то, что будет опрашивать значение переменной, только «подождать некоторое время и решить».

Основная идея состоит в том, чтобы вызвать handleAuth, и внутренне он должен убедиться, что вход в систему не выполняется, ожидая локальной переменной (или что-то произойдет)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Что вы можете сделать, это сделать loggingIn a Subject, вставить событие "done" в loggingIn, а затем flatMap loggingIn в http.post.

0 голосов
/ 19 декабря 2018

Для этой цели вы можете использовать установщик локальной переменной:

private _localVariable;


set localVariable(value) {
  this._localVariable = value;
  if(this._localVariable) {
   //call your function here.
  }
}
...