我正在学习可观察量并尝试实现登录验证服务。 虚拟数据是这样的
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.of
或Observable.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,这取决于您。