Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 嵌套多个异步等待_Node.js_Express_Async Await - Fatal编程技术网

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(同意你的意见。它没有意义),但同样的结果。。。