调用异步函数 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
(我需要手动检查)而不是扔一个?
没有必要将 then
与 async..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 () => {
})();
我有一些 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
(我需要手动检查)而不是扔一个?
没有必要将 then
与 async..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 () => {
})();