如何仅在循环(其中包含函数)完成时运行语句?

Posted

技术标签:

【中文标题】如何仅在循环(其中包含函数)完成时运行语句?【英文标题】:How to run a statement only when the loop (with functions inside it) have completed? 【发布时间】:2020-11-29 10:50:10 【问题描述】:

这是我的代码。

router.route("/login").post((req, res) => 
  const email = req.body.email;
  const password = req.body.password;
  Account.find().then((account) => 
    account.forEach((eachAcc) => 
      if (eachAcc.email.toUpperCase() === email.toUpperCase()) 
        bcrypt.compare(password, eachAcc.password, function (err, result) 
          if (result == true) res.status(200).json("Login Successful");
          else if (err) res.status(400).json("Error: " + err);
        );
      
    );
    res.status(400).json("Invalid email or password");
  );
);

但我总是收到无效的电子邮件/密码,我希望仅在循环完成且电子邮件/密码不匹配时打印它。

请帮忙。

【问题讨论】:

只有在至少有一个错误 400 状态时才应该显示无效的电子邮件/密码? 避免使用if (result == true),要么使用if (result),要么使用if (result === true)。 ***.com/a/15394130/6451036 你在这里使用Account.find()的目的是什么?您需要一个函数作为参数来测试一个值。根据我的理解,不带参数调用它不会返回任何内容。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/… @Sascha 是的错误消息应该显示至少一个错误 @Aroic here Accound.find() 是一个猫鼬查询,用于查找我的数据库中的所有帐户。 mongoosejs.com/docs/api.html#model_Model.find 【参考方案1】:

试试这个

    router.route("/login").post((req, res) => 
      const  email, password  = req.body;
      Account.find().then((account) => 
      let acc = account.find(
         (eachAcc) => eachAcc.email.toUpperCase() === 
            email.toUpperCase()
         );
      if (acc) 
         bcrypt.compare(password, acc.password, function (err, result) 
          
            if (err) res.status(400).json("Error: " + err);
            else if (result) res.status(200).json("Login Successful");
            else res.status(400).json("Invalid password");
          );
          else res.status(400).json("Invalid email");
       );
    );

【讨论】:

【参考方案2】:

您可以为此 setTimeout(()=>//code here,300) 使用 setTimeout 函数。

【讨论】:

在这些情况下切勿使用 setTimeout。 如果他必须等待一段时间才能获取数据,那将是非常糟糕的用户体验【参考方案3】:

希望对你有帮助:

router.route("/login").post((req, res) => 
  const  email, password  = req.body;

  Account.find().then((accounts) => 
    let match = false;
    for (acct of accounts) 
      if (acct.email.toUpperCase() !== email.toUpperCase()) continue;

      bcrypt.compare(password, acct.password, (err, result) => 
        if (err) 
          res.status(400).json("Error: " + err);
          break;
        
        res.status(200).json("Login Successful");
        match = true;
        break;
      );

    
    if (!match) res.status(400).json("Invalid email or password");
  );
);

【讨论】:

我会试试这个。谢谢 它不起作用,我总是得到 Invalid email/password @sandy 你确定你的用户名和密码正确并且与bcrypt.compare()函数匹配吗?

以上是关于如何仅在循环(其中包含函数)完成时运行语句?的主要内容,如果未能解决你的问题,请参考以下文章

只有在 SwiftUI 和 Firebase 中完成循环中的异步调用时,如何才能返回函数?

C while 循环仅在语句为真时运行?

python中函数嵌套循环语句时,return 如何正确使用返回值

仅在元素完全加载时执行一次的函数

如何仅在代码第一次运行时在 python 中运行函数?

第一章 开始