2017-07-08 13 views
0

我正在學習Observables並嘗試實施登錄驗證服務。 僞數據這樣Observable:驗證來自模擬課程的虛擬數據沒有http

export class Users { 
    public users: IUser[] = []; 

    constructor() { 
    this.users = [ 
     new IUser({ username: "protagonist", password: "hello123" }), 
     new IUser({ username: "rono67", password: "[email protected]" }), 
     new IUser({ username: "donaldtrump", password: "[email protected]" })   
    ]; 
    } 

和IUSER的結構是這樣的。

export class IUser { 
    usename:string; 
    password:string; 
} 

我傳遞給服務類輸入的用戶名和密碼,我想有一個觀察的調用,它通過虛擬數據遍歷,如果找到匹配的憑據,應當歸還。我不想進行任何HTTP通話。方法是這樣的 -

validLogin(accountInfo: IUser): Observable<IUser> { 
     return --------- 
      .map((user:IUser) => user.filter((user:IUser) => user.usernanme == accountInfo.username && user.password == accountInfo.password); 
     } 

我不知道哪一段代碼需要寫在返回的地方------。我在網上得到的所有結果都實現了「return this.http.post」

是否可以在模擬數據上應用RxJs?請建議。

+2

'Observable.of(...)'?或者你可以使用[內存web API](https://github.com/angular/in-memory-web-api)並練習一些更真實的東西。 – jonrsharpe

+0

[Angular2:將數組轉換爲Observable]可能的副本(https://stackoverflow.com/questions/35527500/angular2-convert-array-to-observable) – jonrsharpe

回答

1

您可以使用Observable.ofObservable.from從任何東西創建一個Observable對象。因爲,你想要做的IUser陣列的一些操作,我建議你使用Observable.of

這會是什麼樣

export class Users { 
    public users: IUser[] = []; 
    _users: Observable<IUser[]>; 

    constructor() { 
     let users = [ 
     // your dummy data 
     ]; 

     for (let user of users) { 
      this.users.push(new IUser(user)); 
     } 
     this._users = Observable.of(this.users); 
    } 

    validLogin(accountInfo: IUser): Observable<IUser> { 
    return this._users.map((user:IUser) => 
      user.filter((user:IUser) => user.usernanme == accountInfo.username && user.password == accountInfo.password); 
    } 

} 
+0

嗨,我收到以下錯誤「Observable 」is不能指定'Observable '。類型'IUser'不能指定爲'IUser []'類型。'IUser'類型中缺少屬性'length' – Protagonist

+1

'Observable.from'將爲每個用戶創建一個可觀察的流,而不是OP想要的整個數組 – jonrsharpe

+0

@jonrsharpe如何讀取整個數組呢? – Protagonist

0

由於您的Users類已經是一個模擬的實現(直接包含所有用戶的數組),你只需wrap the array into an Observable和過濾基於用戶& PWD返回的第一個結果:

validLogin(accountInfo: IUser): Observable<IUser> { 
    return Rx.Observable.from(users) 
    .filter(dbUser => dbUser.username == accountInfo.username && dbUser.password == accountInfo.password) 
    .take(1);//no user found => observable completes without data 
} 

根據當前implementa如果沒有找到具有正確憑證的用戶但是有錯誤,您可能不想返回一個空的Observable,這取決於您。