1

我确定我在编写代码时没有考虑到异步。但我不知道该怎么做。

// order.xml
const db = require("./db");

let orders = db.getNewOrders();
console.log(orders);

//db.js
const sqlite3 = require("sqlite3").verbose();
let db = new sqlite3.Database(process.env.DB_PATH, err => {
  if (err) {
    console.error(err.message);
  }
  console.log("Connected to the test database.");
});

db.run(
  ....
);

function getNewOrders() {
  let orders = [];
  db.each("SELECT * FROM Orders", function(err, row) {
    orders.push(row);
    console.log(1);
  });
  return orders;
}

module.exports.getNewOrders = getNewOrders;

控制台返回

[]
Connected to the test database.
1

但我期待数据行。我肯定有数据,我用 SQL 客户端检查过。

很明显 getNewOrders 返回一个空数组,因为数据库尚未完成操作。如何更新我的代码,以便数据库完成并填充订单数组,以便我可以在我得到的另一个文件中使用它?

4

1 回答 1

1

getNewOrders您可以从函数返回一个承诺。

您可以使用db.all方法而不是db.each.

使用 await 调用该函数。

const db = require("./db");

db.getNewOrders().then(rows => {
  console.log(rows);
})

//db.js
const sqlite3 = require("sqlite3").verbose();
let db = new sqlite3.Database(process.env.DB_PATH, err => {
  if (err) {
    console.error(err.message);
  }
  console.log("Connected to the test database.");
});

db.run(
  ....
);

function getNewOrders() {
 return new Promise((resolve, reject) => {
  let orders = [];
  db.all("SELECT * FROM Orders", function(err, rows) {
    resolve(rows);
  });
 }
});

module.exports.getNewOrders = getNewOrders;
于 2019-08-09T12:27:11.773 回答