Javascript 异步等待&;承诺解释

Javascript 异步等待&;承诺解释,javascript,node.js,Javascript,Node.js,我对下面的代码有点困惑。当承诺返回时,我们使用。然后和捕获,但在这段代码中它不存在。如果有人能给我解释一下就太好了 另一件事是,当mongo db出现连接错误时,突出显示的代码(“//highlighted 1//”)抛出错误,然后返回catch部分(“//highlighted 2//”)中的server.postasync version。但错误是未定义的。为什么? 这就是为什么我使用了错误!==未定义?错误:“”语句 请引导我 我已将此承诺转换为异步等待。他们工作得很好。此端点用于报告用户

我对下面的代码有点困惑。当承诺返回时,我们使用
。然后
捕获
,但在这段代码中它不存在。如果有人能给我解释一下就太好了

另一件事是,当mongo db出现连接错误时,突出显示的代码(“//highlighted 1//”)抛出错误,然后返回catch部分(“//highlighted 2//”)中的
server.post
async version。但错误是未定义的。为什么?

这就是为什么我使用了
错误!==未定义?错误:“”语句

请引导我

我已将此承诺转换为异步等待。他们工作得很好。此端点用于报告用户调用

-----异步版本

server.post('/reporting_in', async (request, response) => {
    if (reporter.IsReportingOn()) {
        let message = request.body;
        try {
            const msg = await reporter.addLogMessage(message, response);
            response.send(200,{"status": "success"});
        } catch (error) {
            log.error("\n Error logging call details into database : 
\n\n", error!==undefined?error:'', "\n\n"); // highlighted 2 //
            response.send(503, {error: 'Unable to connect db'});
        }
    } else {
        response.send(503, 'Reporting is not enabled');
    }
});
---承诺版本

server.post('/reporting_in', async (request, response) => {
    if (reporter.IsReportingOn()) {
         return new Promise((resolve, reject) => {
             let message = request.body;
             try {
                 reporter.addLogMessage(message, response);
                 resolve(response.send(200));
             } catch (error) {
                 reject(log.error("\n Error logging call details 
into database : \n\n", error, "\n\n"));
        //     }
        // });
    } else {
        response.send(503, 'Reporting is not enabled');
    }
  });
--->此函数位于reporting.js文件中

let addLogMessage = async message => {
  let client;
  try {
    client = await MongoClient.connect(url, {
      useNewUrlParser: true
    });
  } catch (error) {
    throw (log.error(error)); // highlighted 1 //
  }

  try {
    let db = client.db('reporting');
    const res = await db.collection('reports').insertOne(message);
    log.info("\n Succcessfully logged reporting data into the 
database : \n\n");
  } catch (error) {
     log.error("\nError in logging reporting event : \n\n", 
error.stack, "\n\n")
  } finally {
     client.close();
  }

 }

async和await用于处理JavaScript中的异步操作。承诺是否得到解决可以通过then或catch处理

return new Promise((resolve,reject)=>{
//do some task
//if successfull
resolve('done')
//otherwise
reject('unsuccessfull')
});
为了处理承诺,我们使用异步等待和try-and-catch

try{
  const response = await promise;
}catch(e){
 //handle the error
}
注意:wait只能与async一起使用

“异步
/
等待
函数的目的是简化同步使用承诺的行为,并对一组承诺执行某些行为。正如
承诺
类似于结构化回调一样,
异步
/
等待
类似于组合生成器和承诺。”()