我是JavaScript,NodeJS和Express的新手。我编写简单的应用程序,它执行以下操作
- 用户提出请求。
- 服务器进行多个休息调用并呈现响应。
如何确保所有调用都已完成,并创建可以发送给用户的对象?我看到人们说了一些关于async.parallel的事情。这是唯一的出路吗?任何例子都会有所帮助。
您可以使用 promise 按顺序运行代码。 这是我使用 promise 制作的登录功能的示例(稍微缩小)。
在一个名为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
从返回承诺(
findUser
和verifyPassword
)的方法中resolve
的任何内容都将作为名为result
的变量传递.then(function(result)