调用异步函数 main 的正确方法?

The correct way to invoke an async function main?

我有一些 nodejs 脚本 - 即完成工作并完成的进程,而不是连续 运行。

我使用异步函数,例如:

const mysql = require('mysql2/promise');
...

async function main() {
    var conn = await mysql.createConnection(config.mysql);
    ...
    var [response, error] = await conn.execute(`
        DELETE something
        FROM some_table
        WHERE field = ?
    `, [value]);
    ...

就是下面的代码:

main().then(() => process.exit(0)).catch(err => { console.error(err); process.exit(1); });

开始执行异步代码的best/correct方式?

(它有效,但我想确保我没有留下任何可能导致意外的漏洞,例如异常被默默吞噬。)

为什么 conn.execute() return 一个 error (我需要手动检查)而不是扔一个?

没有必要将 thenasync..await 一起使用,因为它是 then.

的语法糖

入口点可以是 async IIFE (IIAFE):

(async () => {
  try {
    var conn = await mysql.createConnection(config.mysql);
    ...
    var [response] = await conn.execute(`
        SELECT something
        FROM some_table
        WHERE field = ?
    `, [value]);
    ...
    process.exit(0);
  } catch (err) {
    console.error(err);
    process.exit(1);
  }
})();

如果连接已关闭,也可能不需要 process.exit(0)

Why does conn.execute() return an error (which I need to manually check) rather than throwing one?

它不会,也不是启用 promise 的函数的常规结果 return 结果错误。

基于回调的 execute uses error-first callback 错误。基于承诺的 execute 不能抛出错误,因为它 return 是一个在出错时被拒绝的承诺。

the documentation 所示,第二个元素是 fields 而不是 error:

const [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]);

它可能 return 被拒绝的承诺,可以在 async 函数中用 try..catch 捕获以防出错。

异步函数声明定义了一个异步函数,return是一个 AsyncFunction 对象。异步函数是通过事件循环异步操作的函数,使用隐式承诺 return 其结果。但是使用异步函数的代码的语法和结构更像是使用标准同步函数。

您还可以使用异步函数表达式定义异步函数。

async function f() {

  try {
    let response = await fetch('http://no-such-url');
  } catch(err) {
    alert(err); // TypeError: failed to fetch
  }
}

f();

您还可以使用以下语法立即调用异步函数

(async () => {

})();