【发布时间】:2019-07-04 02:41:39
【问题描述】:
我创建了一个将数据库响应集成到承诺流中的 API,但我认为代码的解释很复杂,我相信 async/await 方法可以提高理解和代码本身。
API 使用 mongoose 5.6.1 和 express 4.17.1 在 NodeJS 中构建。
你能帮我改进一下吗?
以下是我要改进的 API:
/** New employee */
router.post('/', (req, res) => {
let { idCompany, name, departament } = req.body;
let _id = mongoose.Types.ObjectId(); // Generating new MongoDB _ID
let employeeCreated;
const promise1 = new Promise((resolve, reject) => {
// Querying by document '$oid'
Companies.findOne({ _id: idCompany }, (err, company) => {
// Error returned
if (err) reject({ error: "Invalid request, something went wrong!" });
// Invalid data received
if (!company) reject({ error: "Unauthorized action!" });
// Everything OK
resolve(company);
});
})
.then(company => {
if(company) {
const promise2 = new Promise((resolve, reject) => {
Employees.create({ _id, idCompany, name, departament }, (err, employee) => {
// Error returned
if (err) reject({ error: "Invalid request, something went wrong!", err });
// Everything OK
employeeCreated = employee;
resolve(company);
});
})
return promise2;
}else reject({ error: "Company not found!" });
})
.then(company => {
let { name: companyName, address, email, tel, employees } = company;
employees.push(_id);
const promise3 = new Promise((resolve, reject) => {
Companies.findByIdAndUpdate(
{ _id: idCompany },
{ $set: { _id: idCompany, name: companyName, address, email, tel, employees } }, // spotlight
{ new: true },
(err, company) => {
// Something wrong happens
if (err) reject({ success: false, error: "Can't update company!" });
// Everything OK
resolve(company);
}
);
});
return promise3;
});
promise1
.then(() => res.json({ success: true, employeeCreated }))
.catch(err => res.status(400).json({ error: "Invalid request, something went wrong!", err }));
});
问候。
【问题讨论】:
-
您使用 IDE 吗?我知道 VS Code 提供了一个重构工具。
-
我投票结束这个问题,因为没有尝试过。
-
@jhpratt 你很困惑。 VS Code 如何将 2 层承诺异步链完全重构为同步异步/等待流?这是一个编程技术问题,而不是“IDE 为我做”的问题。
-
首先,
async/await不同步,即使它看起来像。我只是建议一种可以帮助您的工具,这样您就不必手动操作,而不是说这是唯一的方法。
标签: javascript promise async-await