我正在使用Electron with JavaScript并尝试访问SQLite数据库。 db的输出是国家/地区列表。目标是div中的简单ul。该操作由附加到页面上按钮的onclick事件调用。
这是问题所在。从技术上讲,我可以访问数据库。但是,在数据层(data.js)中,我有两个选项,只能从db文件填充数组。在每个中找到的console.log()仅用于调试。
在选项1中,return元素返回完全填充长度为23的数组(参见下面的选项1图像),而将返回元素移出db.all函数会使数组返回顶部空,但在展开时填充长度为0(参见选项2图像)。我认为第一个选项是数组的外观,但由于数组包含在db.all函数中,因此它不会为data.js中的getLocations()返回任何内容。随后,model.js和view.js(下面的代码)中的数组仍未定义。
如果我使用选项2,则数组会填充该行(即数据,模型和视图),但所有数组的长度保持为0,因为它们“在顶部为空”。因此,迭代遍历数组以写入div失败,因为长度最终在0处不正确。
作为旁注,如果我在data.js中将国家/地区硬编码到数组中,一切正常,国家/地区列表会写入页面。虽然我可以(并且需要)从db文件中获取数据,但它似乎会导致上述问题。所以,它实际上是关于data.js如何返回数组的。
有没有人对如何正确填充数组有任何建议,以便我可以遍历它们并写入页面?
感谢您的帮助!!
Data.js选项1:
function getLocations() {
var sqlite3 = require('sqlite3').verbose();
var file = 'db/locations.sqlite3';
var db = new sqlite3.Database(file);
var larray = [];
db.all('SELECT * FROM Country', function(err, rows) {
rows.forEach(function(row) {
larray.push(row.CountryName);
})
console.log(larray);
return larray;
});
}
Data.js选项2:
function getLocations() {
var sqlite3 = require('sqlite3').verbose();
var file = 'db/locations.sqlite3';
var db = new sqlite3.Database(file);
var larray = [];
db.all('SELECT * FROM Country', function(err, rows) {
rows.forEach(function(row) {
larray.push(row.CountryName);
})
});
console.log(larray);
return larray;
}
model.js:
function Locations() {
//Pull location values from data
var viewLoc = getLocations();
return viewLoc;
}
view.js:
function viewLocation() {
var viewLoc = Locations();
var container = document.getElementById('wrapper');
for (var i=0; i < viewLoc.length; i++) {
container.insertAdjacentHTML('beforeend', '<li>' + viewLoc[i]);
}
};
答案 0 :(得分:1)
db.all
是一个异步函数。在从数据库收到响应之前,它的回调函数不会立即执行。
选项1的代码中发生了什么,它将调用db.all
函数,因为它是异步的,它将继续移动到下一行 - 即console.log
,最后{ {1}}这将是空的。
解决问题;您需要将return larray
作为参数接受回调函数。然后,当收到getLocations()
的回复时,填充db.all
并通过回调返回。
示例:
data.js
larray
model.js
function getLocations(done) {
var sqlite3 = require('sqlite3').verbose();
var file = 'db/locations.sqlite3';
var db = new sqlite3.Database(file);
var larray = [];
db.all('SELECT * FROM Country', function(err, rows) {
// This code only gets called when the database returns with a response.
rows.forEach(function(row) {
larray.push(row.CountryName);
})
return done(larray);
});
}
view.js
function Locations(done) {
return getLocations(done);
}
BTW再次查看你的代码。似乎function viewLocation() {
// Pull location values from data
var viewLoc = Locations(function(/*OOPS, THIS WAS MISSING!!=*/results) {
// Code only gets triggered when getLocation() calls return done(...);
var container = document.getElementById('wrapper');
for (var i=0; i < results.length; i++) {
container.insertAdjacentHTML('beforeend', '<li>' + results[i]);
}
});
}
期望从viewLocation()
返回一些东西但是从你的代码中它现在没有返回任何东西,但我怀疑它可能只是你试图调试的东西。无论如何,这不属于问题范围,所以我不会在这里太关注。