Node.js 在继续之前等待未解决的问题
我不熟悉异步函数,我对wait应该如何工作有一些疑问。我有以下函数,我被输出搞糊涂了Node.js 在继续之前等待未解决的问题,node.js,asynchronous,async-await,Node.js,Asynchronous,Async Await,我不熟悉异步函数,我对wait应该如何工作有一些疑问。我有以下函数,我被输出搞糊涂了 arrayA = [] arrayB = [] con.query('SELECT * FROM table', async function(err, result) { test = await 'test'; console.log(test); if (err) throw err; n = 0; for (var column of Object.keys(result)) {
arrayA = []
arrayB = []
con.query('SELECT * FROM table', async function(err, result) {
test = await 'test';
console.log(test);
if (err) throw err;
n = 0;
for (var column of Object.keys(result)) {
arrayA[n] = await result[column].A;
arrayB[n] = await result[column].B;
n = n+1;
}
});
console.log(arrayA);
我期望的结果是:
test
[
"item 1"
"item 2"
...
"item n"
]
但我得到的是:
[]
test
考虑到这一点,很明显,它不是在等待数组被填充之后才继续,甚至不是等待测试变量被写入。我一直在到处寻找关于承诺和异步函数是如何工作的,但还没有解决这个问题,因此非常感谢您的帮助。您在这里混合了两个概念。SQL执行使用回调函数,一旦查询执行完毕,就会调用回调函数。这不是阻塞,这就是为什么会立即打印空数组 您现在已经将回调函数定义为异步,这意味着您可以在其中等待其他异步操作。然后,该等待被阻塞,但仅在该执行上下文函数的上下文中。假定字符串赋值不是真正的异步操作,它的行为可能与函数的正常执行没有任何不同。con.query是异步的,因此回调是异步的,因此您的上一个console.logarrayA不会在执行前等待con.query和中的回调完成 评论中的事件顺序如下: 1. arrayA=[] 2. arrayB=[] 3查询被发送到服务器,但我们不等待响应 con.查询'SELECT*FROM table',异步函数err,结果{ 5 wait将暂停执行,以便执行 右边的表达式,字符串不是承诺,所以这不起任何作用 测试=等待“测试”; 6. 控制台日志测试; 7. 如果犯了错误,就扔出错误; 8. n=0; 9、10等 对于Object.keysresult的var列{ 结果[column].A是承诺吗?如果不是,wait不会做任何事情。 arrayA[n]=等待结果[列].A; arrayB[n]=等待结果[列].B; n=n+1; } }; 4仍在等待服务器响应,已安排回调 console.logaraya; 您需要的是等待con.query,但由于它使用回调,因此等待将不起作用,因此您需要用承诺或承诺来包装: 异步=>{ arrayA=[] arrayB=[] //等待直到调用resolve 等待新的承诺者解决,拒绝=>{ con.querySELECT*FROM表,异步函数错误,结果{ 如果错误返回rejecterr; 对于Object.keysresult的var列{ arrayA[n]=结果[列].A; arrayB[n]=结果[列].B; } //如果需要的话,你可以在这里等待更多的事情 //在这里调用resolve解决了我们等待con.query的承诺 决定 }; }; //既然我们在等待上面的承诺,就应该进行con.query console.logaraya; }.catch=>{ 控制台错误; 进程exit1 }; 同时使用回调和承诺总是有点冗长。许多库都实现了promise接口,因此,如果您使用的mysql客户端库支持promise接口,则可以像下面这样简单: const rows=wait con.querySELECT*从表中选择; rows.forEachrow=>{…};
有多种方法可以解决这个问题。但这是最方便的
var arrayA = [];
var arrayB = [];
try {
var result = await con.query("SELECT * FROM table");
n = 0;
for (var column of Object.keys(result)) {
arrayA[n] = await result[column].A;
arrayB[n] = await result[column].B;
n = n + 1;
}
console.log(arrayA);
} catch (err) {
console.log(err);
}
你可以阅读更多关于这个主题的内容