Node.js 嵌套多个异步等待
我有以下快速端点:Node.js 嵌套多个异步等待,node.js,express,async-await,Node.js,Express,Async Await,我有以下快速端点: 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.manage
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);
});
});
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
}
});
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
,此函数取决于wait all
中提取的值。因此,现在Express在从mongoose数据库(db
)获取信息之前返回一个响应
处理这个问题的方法是什么
谢谢大家 我会对代码进行一些重构,使其更易于阅读,并从
ruleCtrl.manageRule(detection,res)返回结果代码>。
请求可能只是超时,因为原始代码缺少返回或等待(以确保它完成执行)
快速端点:
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);
});
});
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
}
});
async await的最大好处之一是不再使用链式承诺,因此只需将await的结果返回给变量,而不用使用。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.json
或res.status
,我只想跟踪何时结束函数执行
您可以进一步重构ruleCtrl.manageRule
方法,方法是不将res作为参数发送,而是从db.getRule
返回结果。让router.post('/verify
)处理req和res,以便更易于阅读。是“db.getRule(identifierDetected);”异步?没有什么必要等待所有。然后()。如果要使用.then()
,只需关闭等待
。或者,在不使用的情况下执行让results=wait all(…)
。然后()
,然后在下一行代码中使用results
。选择一种或另一种风格。您正在使用await
,但没有利用使用await
的原因。这毫无意义。要么利用它的优点使用它,要么不要使用它。@Faheem更新了我的帖子。使用Promise.all()
和一个承诺也没有意义。@jfriend00我已经删除了last Wait(同意你的意见。它没有意义),但同样的结果。。。