Javascript Can';不要违背诺言
我不知道为什么我不能正确地连接承诺,这是我的代码Javascript Can';不要违背诺言,javascript,asynchronous,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
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()是在完成身份验证之前实现的。
那么,我如何才能以更好的方式编写代码呢?多谢各位 问题在于,authenticate函数的主体不返回任何内容。它调用一个异步函数,该函数使用回调,然后返回一个隐式承诺,该承诺解析为
未定义的
async function authenticate(uname, pword) {
User.find({username: uname}, 'password', function (err, result) {
// This will run sometime after authenticate returns
});
}
您需要包装用户。在承诺中查找调用
// here is the function authenticate
async function authenticate(uname, pword) {
return new Promise(function (resolve, reject) () {
User.find({username: uname}, 'password', function (err, result) {
if (err !== null){
resolve(false);
}
else{
if (pword === result[0].password){
console.log("Correct Password!");
resolve(true);
}
// Also add an else here, to ensure the promise always ends:
else {
resolve(false);
}
}
});
});
}
使用异步
:
async function authenticate(uname, pword) {
return await User.find({ username: uname }, 'password').then(function (result) { ... })
};
function authenticate(uname, pword) {
return User.find({ username: uname }, 'password').then(function (result) { ... })
};
无async
:
async function authenticate(uname, pword) {
return await User.find({ username: uname }, 'password').then(function (result) { ... })
};
function authenticate(uname, pword) {
return User.find({ username: uname }, 'password').then(function (result) { ... })
};
问题是您正在从回调函数返回承诺。那样做没有意义。您需要从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);
}
}
})
});
}
@31P异步函数不一定需要等待。函数身份验证
不返回任何内容,因此,正如异步函数身份验证
一样,它将返回一个解析为未定义
的承诺-这就是您所看到的。我得到了一个无需等待的用户。find
也会返回一个承诺,这行不通,是的。Node.js中的大多数ORM都是基于承诺的。他应该试试看。