Node.js 在继续之前等待未解决的问题

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)) {

我不熟悉异步函数,我对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[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);
}
你可以阅读更多关于这个主题的内容