0

我想再次发送 (err) => { if (err) throw Error("error: insert client"); },在调用它但 try catch 不起作用的函数中,我应该使用承诺吗?还是回调?因为函数发送邮件是同样的问题,我认为它更清楚地尝试像第一个示例一样使用 try catch,但我不确定。谢谢您的帮助。

const somefunction = ( res, req ) => {
 try 
 {
   registerClient( 2, res.data);
   sendMail( "user@gmail.com", "welcome" );
 } 
 catch( e )
 { res.send( e ) }
}

const registerClient = (id, data) => {

  const time = new Date();

  const query =
    "INSERT INTO clientes( name, lastname, date, fk_user, type ) " +
    "VALUES ( ?, ?, ?, ?, 'client' )";

  connection.query(
    query,
    [data.name, data.lastname, time, id, ],
    (err) => {
      if (err) throw Error("error: insert client");
    }
  );
};
4

1 回答 1

1

我应该使用承诺?还是回调?

是的。

try/catch块是同步的,因此它无法捕获异步抛出。

在您的代码中:

(err) => {
  if (err) throw Error("error: insert client");
}

错误“保留”在箭头函数内,它不会冒泡,因为它是异步执行的(在 I/O 到数据库之后)。

这是您可以使用的回调示例:

const somefunction = (res, req) => {
  registerClient(2, res.data, (err) => {
    if (err) {
      res.send(e)
    } else {
      sendMail('user@gmail.com', 'welcome') // fire and forget style (?)
      res.send('done')
    }
  })
}

const registerClient = (id, data, cb) => {
  const time = new Date()

  const query =
     'INSERT INTO clientes( name, lastname, date, fk_user, type ) ' +
     "VALUES ( ?, ?, ?, ?, 'client' )"

  connection.query(
    query,
    [data.name, data.lastname, time, id],
    cb
  )
}
于 2020-10-08T10:06:43.670 回答