可观察量:在没有 http 的情况下验证来自模拟类的虚拟数据



我正在学习可观察量并尝试实现登录验证服务。 虚拟数据是这样的

export class Users {
public users: IUser[] = [];
constructor() {
this.users = [
new IUser({ username: "protagonist", password: "hello123" }),
new IUser({ username: "rono67", password: "!@vioped" }),
new IUser({ username: "donaldtrump", password: "melenia@34" })          
];
}

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);
}

我不确定需要在返回的地方编写哪段代码------.我在网络上得到的所有结果都在实现"返回 this.http.post">

是否可以在模拟数据上应用 RxJ?恳请建议。

您可以使用Observable.ofObservable.from从任何内容创建可观察对象。由于您想对数组进行一些操作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);
}
}

由于您的Users类已经是一个模拟实现(直接在数组中包含所有用户(,因此您可以将数组包装到 Observable 中,并根据 user&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
}

根据当前的实现,如果没有找到具有正确凭据但错误的用户,您可能不希望返回空的 Observable,这取决于您。

相关内容

最新更新