所以我在这里错过了一些东西。我的目标是使每个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
可以看到数据返回一样。
答案 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));
});