Observable:验证来自模拟课程的虚拟数据没有http

Observable:验证来自模拟课程的虚拟数据没有http

问题描述:

我正在学习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://*.com/questions/35527500/angular2-convert-array-to-observable) – jonrsharpe

您可以使用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

由于您的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,这取决于您。