【问题标题】:How to migrate my mongoose PROMISE chain transactions to ASYNC / AWAIT flow?如何将我的猫鼬 PROMISE 链交易迁移到 ASYNC / AWAIT 流?
【发布时间】: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


【解决方案1】:

在猫鼬中使用 Promise 的一个关键是使用 exec 方法:

您的代码可能看起来像这样(未经测试):

router.post('/', async (req, res) => {
    try {
        const { idCompany, name, departament } = req.body;
        const _id = mongoose.Types.ObjectId();
        const company = await Companies.findOne({ _id: idCompany }).exec();
        const employeeCreated = await Employees.create({ _id, idCompany, name, departament });
        const { name: companyName, address, email, tel, employees } = company;
        employees.push(_id);
        await Companies.findByIdAndUpdate(
                    { _id: idCompany },
                    { $set: { _id: idCompany, name: companyName, address, email, tel, employees } }, // spotlight
                    { new: true }).exec();
        res.json({ success: true, employeeCreated });
    } catch(err) {
        res.status(400).json({ error: "Invalid request, something went wrong!", err });
    }
});

如果您认为有必要,您可以在 try 块中抛出一些特定的自定义错误。

【讨论】:

  • 谢谢,效果很好,我不知道exec 方法。
【解决方案2】:

您可以简单地使您的 Promise 运行的函数异步,因此您可以等待 Promise 解决。

例如,在你的路线中使用这个:

router.post('/', async (req, res) => {

然后在执行异步操作时,使用这个:

const company = await Companies.findOne({ _id: idCompany }).exec();

另外,我建议你用 try and catch 语句来包装它

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2021-06-18
    • 2013-06-28
    • 1970-01-01
    • 2018-02-05
    • 2018-07-10
    • 2018-09-20
    • 2014-06-24
    相关资源
    最近更新 更多