承诺拒绝,然后再进行循环

时间:2019-07-16 15:55:50

标签: javascript typescript

这可能是一个简单的解决方法,但是在使用Promise循环时遇到了问题。我正在使用Angular和Typescript。

作为背景,我正在尝试实现一个非常简单的用户身份验证登录页面。我有一个用户对象数组,每个对象都包含用户名,密码等。在登录页面上,当用户输入用户名/密码时,单击“登录”按钮,将触发一个promise函数,该函数遍历该数组以查看数组和用户输入是否匹配。

这是我编写的一些伪代码,其中usersList是用户数组,users.usernameusers.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循环的第一次迭代。我将如何解决此问题,使其仅在循环遍历数组中的每个对象后才拒绝?

3 个答案:

答案 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"
        })
  }