gpt4 book ai didi

node.js - 嵌套多个异步等待

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:36 24 4
gpt4 key购买 nike

我有以下 Express 端点:

const all = require('promise-all');

router.post('/verify', upload.single('photo'), async (req, res) => {
...
await all({'p1': p1, 'p2': p2}).then((response) => {
...
console.log("Response:",
ruleCtrl.manageRule(detection, res);
});
});

ruleCtrl.manageRule如下:

export async function manageRule(identifierDetected, res) {
let rule = db.getRule(identifierDetected);
await all([rule]).then((ruleExtracted) => {
...
res.json(ruleExtracted);
}).catch((err) => {
res.status(418).send("DOCUMENT_NOT_RECOGNIZED");
});
}

db.getRule:

export async function getRule(idRule) {
return new Promise((resolve, reject) => {
Rule.findOne({ruleID: idRule}, (err, rule) => {
if (err) {
reject("MongoDB Rule error: " + err);
} else {
resolve(rule);
}
});
})
}

我的响应是manageRule,该函数取决于提取到await all 中的值。因此,现在,Express 在从 mongoose 数据库 (db) 获取信息之前返回响应。

有什么方法可以解决这个问题?

谢谢大家!

最佳答案

我会稍微重构您的代码以使其更易于阅读,并返回 ruleCtrl.manageRule(detection, res); 的结果。该请求可能只是超时,因为您的原始代码缺少返回或等待(以确保它完成执行)

快速端点:

const all = require('promise-all');

router.post('/verify', upload.single('photo'), async (req, res) => {
...
// Catch any exceptions from the promises. This is the same as using .catch
try {
// Lets assign the returned responses to variable
let [p1Result, p2Result] = await all({'p1': p1, 'p2': p2});
...
console.log("Responses:", p1Result, p2Result);
// return the response from manageRule method
return ruleCtrl.manageRule(detection, res);
} catch(err) {
// Handle err here
}
});

异步等待的最大好处之一是摆脱链式 promise ,因此只需将等待结果返回到变量即可,而不是使用 .then()

ruleCtrl.manageRule

export async function manageRule(identifierDetected, res) {
// Use try catch here to catch error from db.getRule. Assign to variable and return
// res.json
try {
let ruleExtracted = await db.getRule(identifierDetected);
...
return res.json(ruleExtracted);
} catch(err) {
return res.status(418).send("DOCUMENT_NOT_RECOGNIZED");
}
}

您不必在这里返回 res.jsonres.status,我只是想跟踪何时结束函数执行。

您可以进一步重构 ruleCtrl.manageRule 方法,不将 res 作为参数发送,而是从 db.getRule 返回结果。让 router.post('/verify) 处理 req 和 res,以便使其更易于阅读。

关于node.js - 嵌套多个异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52917278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com