我是JavaScript,NodeJS和Express的新手。我写的是简单的应用程序,它执行以下操作
如何确保所有调用都已完成,我创建了一个可以发送给用户的对象?我看到有人说过async.parallel。那是唯一的出路吗?任何例子都会有所帮助。
答案 0 :(得分:1)
您可以使用promises按顺序运行代码。 这是我使用promises创建的登录功能的一个示例(缩小了一点)。
在名为LoginController
的模块中,我放置了这段代码。
this.attemptLogin = function(body, res) {
var reason = "";
var user = null;
loginM.findUser(body.username)
.then(function(result) {
if (result.status) {
user = result.result[0];
return this.verifyPassword(body.password, result.result[0].Password);
} else {
reason = {status: false, message: "Incorrect username", result: null};
throw(reason);
}
})
.then(function(result) {
if (result.message) {
res.send({status: true, message: "Successfully logged in", result: user});
return;
} else {
reason = {status: false, message: "Incorrect password", result: null};
throw(reason);
}
}).catch(function(err) {
res.send(err);
});
}
在名为LoginModel
(LoginM
)的另一个模块中,我已经放置了此代码
this.findUser = function(username, email) {
return new Promise(function (resolve, reject) {
pool.getConnection(function (err, connection) {
if (err) {
reject({status: false, message: err});
} else {
connection.query('select Id, Name, Email, Password from Users ' +
'where (Users.Name = ? OR Users.Email = ?) AND Removed = 0 LIMIT 1', [username, email], function (err, rows) {
connection.release();
if (!err) {
if(rows.length > 0) {
resolve({status: true, message: "Found user", result: rows});
}
else
resolve({status: false, message: null})
} else {
reject({status: false, message: err});
}
});
}
});
});
}
verifyPassword
的类似方法也会返回一个承诺。
现在,需要注意的是:
每个then
内的代码都是异步运行的
then
部分按顺序执行,即在您从之前的then
then
/ LI>
返回承诺的方法resolve
(findUser
和verifyPassword
)作为result
中名为.then(function(result)
的变量传递1} p>