无法实现承诺

时间:2017-12-13 04:31:03

标签: javascript asynchronous

我不知道为什么我不能正确地链接承诺,这是我的代码

app.post('/login', urlencodedParser, async (req, res) => {
  // authenticate is async function that return promise
  model.authenticate(req.body.uname, req.body.pword)
    .then(function (result) {
      console.log(result);
      // ... some codes
    });
});

// here is the function authenticate
async function authenticate(uname, pword) {
  User.find({username: uname}, 'password', function (err, result) {
    if (err !== null){
      return new Promise(function (resolve, reject) {
        resolve(false);
      });
    }
    else{
      if (pword === result[0].password){
        console.log("Correct Password!");
        return new Promise(function (resolve, reject) {
            resolve(true);
        });
      }

但是我的控制台中的输出是

undefined
Correct Password!

,表示在完成身份验证之前实现.then()。 那么我怎么能以更好的方式编码呢?非常感谢你!

3 个答案:

答案 0 :(得分:2)

问题是你从回调函数返回promise。这样做没有意义。您需要从authenticate函数&中返回一个承诺。一旦该功能完成预期的工作,就解决/拒绝它。请查看以下代码,它应该解决您的问题

/* This function doesnt need to be async */
function authenticate(uname, pword) {
  return new Promise((resolve, reject) => {
    User.find({username: uname}, 'password', function (err, result) {
      if (err !== null) {
        /* I think this should be reject(err) but since you wish to have it resolved in your code, i have kept resolve()*/
        resolve(false);
      }
      else {
        if (pword === result[0].password) {
          console.log("Correct Password!");
          resolve(true);
        }
      }
    })
  });
}

答案 1 :(得分:1)

问题是您的身份验证功能的主体不会返回任何内容。它调用异步函数,它使用回调函数,然后返回一个隐式的函数,并将其解析为2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

undefined

您需要将async function authenticate(uname, pword) { User.find({username: uname}, 'password', function (err, result) { // This will run sometime after authenticate returns }); } 调用包含在承诺中。

User.find

答案 2 :(得分:1)

使用.main-wrapper{ padding:15px; } .header, .footer{ text-align: center; } .header p, .footer p{ padding:10px; background-color: green; color: white; } .content{ height: 200px; overflow: scroll; } .content-card{ border-bottom: 1px solid black; }

async

没有async function authenticate(uname, pword) { return await User.find({ username: uname }, 'password').then(function (result) { ... }) };

async