Nodejs异步跳过等待状态

时间:2020-10-07 21:36:55

标签: node.js async-await

所以我在这里错过了一些东西。我的目标是使每个console.log语句具有连续的顺序,但是出于某些原因,运行时无需等待我的await命令就可以继续。 这是一个简化的示例:

# Setup a method
exports.selectAll = async (db) => {
  db.run("SELECT * FROM stats", (err, data) => {
    if (err) console.error(err);
    else {
      console.log("Hit1");
      return data;
    }
  });
};

从数据库返回一些较长命令的简单过程。但是当我打电话给这个时:

## Runtime
(async () => {
  const db = await exports.open();
  const data = await exports.selectAll(db);
  console.log("Hit2");
  console.log(data);
  console.log("Hit3");
  exports.close(db);
})()

我得到以下输出:

Hit2
undefined
Hit3
sql - connected
Hit1
sql - db closed

函数为什么不等待const data = await exports.selectAll(db);

快点说: 我已经确认它不是db.run的问题,就像在Hit1之后我console.log可以看到数据返回一样。

1 个答案:

答案 0 :(得分:0)

因为在selectAll内部,您不会返回任何等待的内容,并且由于db.run调用是IO绑定的,因此它将触发查询并将上下文传递回线程,这意味着控制台日志将首先被处理(在数据库回调运行之前)。

如果您正在使用的库不支持Promises,则需要创建自己的库:

exports.selectAll = db => new Promise((resolve, reject) => {
  db.run("SELECT * FROM stats", (err, data) => err ? reject(err) : resolve(data));
});