这可能是一个简单的解决方法,但是在使用Promise循环时遇到了问题。我正在使用Angular和Typescript。
作为背景,我正在尝试实现一个非常简单的用户身份验证登录页面。我有一个用户对象数组,每个对象都包含用户名,密码等。在登录页面上,当用户输入用户名/密码时,单击“登录”按钮,将触发一个promise函数,该函数遍历该数组以查看数组和用户输入是否匹配。
这是我编写的一些伪代码,其中usersList
是用户数组,users.username
和users.password
是用户输入。
for (var i = 0; i < this.usersList.length; i++) {
if (this.usersList[i].email === user.username && this.usersList[i].password === user.password) {
resolve({
/* code */
})
} else {
reject({
message: "User/Password not found"
})
}
但是,这仅适用于列表中的第一个对象,因为Promise拒绝了for循环的第一次迭代。我将如何解决此问题,使其仅在循环遍历数组中的每个对象后才拒绝?
答案 0 :(得分:2)
一个明显的问题是,一旦检查了一项但发现与输入不匹配,您就在呼叫reject
。循环的确继续进行,但是到那时,resolve
还为时已晚。
一个更好的主意可能是过滤您的users
列表,以查看该项目是否存在,如果存在,则resolve
否则为reject
。像这样:
var foundItems = this.usersList.filter(u => u.username == user.username && u.password == user.password);
if(foundItems.length){
resolve({
/* code */
});
}
else{
reject({
message: "User/Password not found"
});
}
您也可以使用find
来达到类似的效果:
var user = this.usersList.find(u => u.username == user.username && u.password == user.password);
if(user){
resolve({
/* code */
});
}
else{
reject({
message: "User/Password not found"
});
}
答案 1 :(得分:0)
基本上,您可以通过移动拒绝来修复代码。
for (var i = 0; i < this.usersList.length; i++) {
if (this.usersList[i].email === user.username && this.usersList[i].password === user.password) {
resolve({
/* code */
})
return
}
}
reject({
message: "User/Password not found"
})
找到后,您需要返回以中断循环,并且,如果此代码在函数中运行,还需要停止执行该函数。
答案 2 :(得分:0)
在第一次迭代时拒绝Promise,因为它与Array的index(0)处的对象和执行else循环中的代码不匹配。要解决此问题,如果未在最后一个迭代之前的所有迭代中均未解决,则应编写代码,在诺言最后一次迭代时拒绝它。
for (var i = 0; i < this.usersList.length; i++) {
if (this.usersList[i].email === user.username && this.usersList[i].password === user.password) {
resolve({
/* code */
})
} else if(i === this.usersList.length - 1) {
reject({
message: "User/Password not found"
})
}