簡體   English   中英

嵌套的Observables在Ionic2 / Angular2 App中的行為有所不同

[英]Nested Observables behaving differently in Ionic2/Angular2 App

我正在創建一個離子登錄模塊,其中有2個可觀察對象,其中1個位於其中,不確定這是否是正確的實現方式,

在這里,我嘗試調用getHTTP()方法,獲取一個字符串,如果該字符串不為空,則將其設置為ionic-storage變量,然后在登錄之前進行驗證

由於Observables是異步的-getHTTP()在login(credentials)流之后完成,請幫幫我

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
import {Observable} from 'rxjs/Observable';
import {Headers} from '@angular/http';
import {  Response } from '@angular/http';
import { Storage } from '@ionic/storage';


export class User {
  name: string;
  password: string;
  url: string;

  constructor(name: string, password: string, url: string) {
    this.name = name;
    this.password = password;
    this.url = url;
  }
}


/*
  Generated class for the AuthService provider.

  See https://angular.io/docs/ts/latest/guide/dependency-injection.html
  for more info on providers and Angular 2 DI.
*/
@Injectable()
export class AuthService {

  currentUser: User;
  data = '';

  constructor(public http: Http,private storage: Storage) {
    console.log('Hello AuthService Provider');
  }



  // Make a call to Get CSRF and check if we have access
  public getHTTP(credentials) {
        let responseCSRF ;
        const headers: Headers = new Headers();
        headers.append('Authorization', 'Basic ' + btoa(credentials.user + ':' + credentials.password));
        headers.append('Content-Type', 'application/json');
        console.log(headers);
        console.log('Clearing cache');
        this.storage.set('CSRF', '');
        this.storage.set('Auth',btoa(credentials.user + ':' + credentials.password));
        this.storage.set('url', credentials.url);
        //return
        responseCSRF = this.http.get('http://' + credentials.url +'/Windchill/servlet/rest/security/csrf', {
          headers: headers
        }).map((response: Response) =>  response.json());
        //console.log(typeof(responseCSRF))
        responseCSRF.subscribe(x => {
          console.log('CSRF ->' + x.items[0].attributes.nonce)
          this.data = x.items[0].attributes.nonce;
          if(typeof this.data!='undefined' && this.data) {
            this.storage.set('CSRF', this.data);
          }
        });
        return responseCSRF;
      }


  public login(credentials) {
       if (credentials.user === null || credentials.password === null || credentials.url === null ) {
         return Observable.throw("Please insert credentials ");
       } else {

        return Observable.create(observer => {
          // At this point make a request to your backend to make a real check!
          let access = false;
          this.getHTTP(credentials).subscribe (
          (resBody) => console.log('Boby is '+resBody),
          error => console.error('Error from auth-service: ' + error))
           ,  () => console.log('Completed!' + 'Auth' );

           this.storage.get('CSRF').then((val) => {
               console.log('Your CSRF is'+ val);
               if(val!='undefined') {
                 access = true;
               }
             });

          observer.next(access);
          observer.complete();
         });
       }
  }

public getUserInfo() : User {
  return this.currentUser;
}

public logout() {
  return Observable.create(observer => {
    this.currentUser = null;
    observer.next(true);
    observer.complete();
  });
}

}

在控制台中

Headers {_headers: Map(2), _normalizedNames: Map(2)}
auth-service.ts:49 Clearing cache
auth-service.ts:57 pluck -->[object Object]
auth-service.ts:83 Your CSRF is
auth-service.ts:59 CSRF ->RkPYp+UtGGMRB+8NJHCr9rJ6WhBHdIVCfim585xXKgZ1TKUmf3v39tBqVRkjSb93dgWi4oF3KF4rNts0c3frktUdIFokNNVrMSGM47V3KwQhP8A5ARKr5rBsaxtmOtI=
auth-service.ts:78 Boby is [object Object]

嘗試將您的storage.get邏輯放入訂閱處理程序中:

        return Observable.create(observer => {
            // At this point make a request to your backend to make a real check!
            let access = false;
            this.getHTTP(credentials).subscribe(
                (resBody) => {
                    console.log('Boby is ' + resBody);
                    this.storage.get('CSRF').then((val) => {
                        console.log('Your CSRF is' + val);
                        if (val != 'undefined') {
                            access = true;
                        }

                        observer.next(access);
                        observer.complete();
                    });
                },
                error => console.error('Error from auth-service: ' + error),
                () => console.log('Completed!' + 'Auth'));
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM