我有一些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); });
开始执行异步代码的最佳/正确方法?
(它可以工作,但是我要确保没有留下任何可能引起意外的漏洞,例如默默地吞下异常。)
为什么conn.execute()
返回一个error
(我需要手动检查)而不是扔一个?{p1
答案 0 :(得分:1)
不需要将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)
。
为什么conn.execute()返回错误(我需要手动检查)而不是抛出错误?
启用承诺的函数返回结果中的错误不是,并且也不是常规的。
基于回调的execute
uses error-first callback中的错误。基于承诺的execute
不会抛出错误,因为它返回的承诺会在出现错误的情况下被拒绝。
如the documentation所示,第二个元素是fields
而不是error
:
const [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]);
如果出现错误,它可能会返回try..catch
函数中的async
捕获的拒绝承诺。
答案 1 :(得分:0)
异步函数声明定义了一个异步函数,该函数返回一个AsyncFunction对象。异步函数是通过事件循环异步运行的函数,使用隐式Promise返回其结果。但是,使用异步函数的代码的语法和结构更像使用标准同步函数。
您还可以使用异步函数表达式来定义异步函数。
async function f() {
try {
let response = await fetch('http://no-such-url');
} catch(err) {
alert(err); // TypeError: failed to fetch
}
}
f();
您还可以使用以下语法立即调用异步函数
(async () => {
})();